本文共 1532 字,大约阅读时间需要 5 分钟。
#include #include #include #include #include #include #include #include #include #include using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int maxn=100000; ll data[4*maxn+5],datb[4*maxn+5],l[maxn+5],r[maxn+5],v[maxn+5]; char op[maxn+5][3]; ll max(ll a,ll b) { return a>b?a:b; } ll min(ll a ,ll b) { return a a&&l >1,l,r); ll right=s(2*k+2,(a+b)>>1,b,l,r); sum=data[k]*(min(b,r)-max(a,l))+left+right; } return sum; } void add(int k,int a,int b,int l,int r,int v) { if(l<=a&&b<=r) data[k]+=v; else if(r>a&&l >1,l,r,v); add(2*k+2,(a+b)>>1,b,l,r,v); } } int main() { int n,c,temp; while(~scanf("%d %d",&n,&c)) { for(int i=1;i<=n;i++) { scanf("%d",&temp); add(0,1,n+1,i,i+1,temp); } for(int i=1;i<=c;i++) { scanf("%s",op[i]); if(op[i][0]=='Q') scanf("%d %d",&l[i],&r[i]); else scanf("%d %d %d",&l[i],&r[i],&v[i]); } for(int i=1;i<=c;i++) { if(op[i][0]=='Q') printf("%lld\n",s(0,1,n+1,l[i],r[i]+1)); else add(0,1,n+1,l[i],r[i]+1,v[i]); } } return 0; }
转载地址:http://ovgsi.baihongyu.com/