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.
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.
You need to answer all Q commands in order. One answer in a line.
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 4Sample Output
4 55 9 15
线段树模板题:
#include<algorithm> #include<string.h> #include<stdio.h> #define LL long long #define M 100010 using namespace std; struct node { int l,r; LL n,f; }a[4*M]; LL ans; void down(int k)//懒标记 { a[2*k].n+=a[k].f*(a[2*k].r-a[2*k].l+1); a[2*k+1].n+=a[k].f*(a[2*k+1].r-a[2*k+1].l+1); a[2*k].f+=a[k].f; a[2*k+1].f+=a[k].f; a[k].f=0; } void init(int l,int r,int k)//建树 { a[k].r=r; a[k].l=l; if(l==r) { a[k].n=0; a[k].f=0; return ; } int mid=(l+r)>>1; init(l,mid,2*k); init(mid+1,r,2*k+1); } void insert_trie(int l,int r,int k,int x)//区间修改 { int mid; if(a[k].r<=r&&a[k].l>=l) { a[k].n+=x*(a[k].r-a[k].l+1); a[k].f+=x; return ; } mid=(a[k].l+a[k].r)>>1; if(a[k].f)down(k); if(mid>=r)insert_trie(l,r,2*k,x); else if(mid<l)insert_trie(l,r,2*k+1,x); else { insert_trie(l,mid,2*k,x); insert_trie(mid+1,r,2*k+1,x); } a[k].n=a[2*k].n+a[2*k+1].n; } void search_trie(int l,int r,int k)//区间查询 { int mid; if(a[k].r<=r&&a[k].l>=l) { ans+=a[k].n; return ; } mid=(a[k].l+a[k].r)>>1; if(a[k].f)down(k); if(mid>=r)search_trie(l,r,2*k); else if(mid<l)search_trie(l,r,2*k+1); else { search_trie(l,mid,2*k); search_trie(mid+1,r,2*k+1); } } int main() { char s[10]; int n,m,x,y,z; while(~scanf("%d%d",&n,&m)) { init(1,n,1); for(int i=1;i<=n;i++) { scanf("%d",&x); insert_trie(i,i,1,x); } while(m--) { scanf("%s",s); if(!strcmp(s,"Q")) { ans=0; scanf("%d%d",&x,&y); search_trie(x,y,1); printf("%I64d\n",ans); } else { scanf("%d%d%d",&x,&y,&z); insert_trie(x,y,1,z); } } } }