Time Limit: 5000MS | Memory Limit: 131072K | |
Total Submissions: 47647 | Accepted: 14004 | |
Case Time Limit: 2000MS |
Description
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4
Sample Output
4 55 9 15
#include<stdio.h> #include<stdlib.h> int w[100010]; typedef struct Node{ struct Node *lc,*rc; int left,right; __int64 value,add; }Tire,*Interval_Trie; void Build(Interval_Trie &T,int left,int right){ int mid; T=(Interval_Trie)malloc(sizeof(Tire)); T->lc=NULL; T->rc=NULL;//每次申请一个结点空间 T->left=left; T->right=right; T->add=0; if(left==right) { T->value=w[left]; return ;//递归出口 } mid=(left+right)>>1; Build(T->lc,left,mid); Build(T->rc,mid+1,right); T->value=T->lc->value+T->rc->value; } void update(Interval_Trie &T,int left,int right,__int64 add){ int mid; if(T->left==left&&T->right==right) { T->add+=add; return ;//递归出口 } T->value+=(right-left+1)*add; mid=(T->left+T->right)>>1; if(right<=mid) update(T->lc,left,right,add); else if(left>=mid+1) update(T->rc,left,right,add); else { update(T->lc,left,mid,add); update(T->rc,mid+1,right,add); }//else }//update __int64 query(Interval_Trie &T,int left,int right){ int mid=(T->left+T->right)>>1; if(T->left==left&&T->right==right) return T->value+(T->right-T->left+1)*T->add; else {//可能区间有增量,需计算并下移 T->lc->add+=T->add; T->rc->add+=T->add;//增量下移 T->value+=(T->right-T->left+1)*T->add; T->add=0; }//else if(right<=mid) return query(T->lc,left,right); if(left>=mid+1) return query(T->rc,left,right); return query(T->lc,left,mid)+query(T->rc,mid+1,right); }//query void ftree(Interval_Trie &T){ if(T!=NULL){ if(T->lc!=NULL) ftree(T->lc); if(T->rc!=NULL) ftree(T->rc); free(T); } } int main() { int n,q,i,a,b,c; char s[3]; while(scanf("%d %d",&n,&q)!=EOF) { Interval_Trie T; for(i=1;i<=n;i++) scanf("%d",&w[i]); Build(T,1,n); for(i=1;i<=q;i++) { scanf("%s",s); if(s[0]=='C') { scanf("%d %d %d",&a,&b,&c); update(T,a,b,c); }//if else { scanf("%d %d",&a,&b); printf("%I64d\n",query(T,a,b)); }//else }//for ftree(T);//释放空间 }//while // system("pause"); return 0; }