题目描述
如题,已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.求出某区间每一个数的和
输入输出格式
输入格式:
第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。
第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。
接下来M行每行包含3或4个整数,表示一个操作,具体如下:
操作1: 格式:1 x y k 含义:将区间[x,y]内每个数加上k
操作2: 格式:2 x y 含义:输出区间[x,y]内每个数的和
输出格式:
输出包含若干行整数,即为所有操作2的结果。
输入输出样例
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=8,M<=10
对于70%的数据:N<=1000,M<=10000
对于100%的数据:N<=100000,M<=100000
(数据已经过加强^_^,保证在int64/long long数据范围内)
样例说明:
1 #include<cstdio> 2 #define N 100002 3 using namespace std; 4 struct name{ 5 int l,r; 6 long long lazy,sum; 7 }t[4*N]; 8 int n,m; 9 long long a[N]; 10 void push_up(int p) 11 { 12 t[p].sum=t[p<<1].sum+t[(p<<1)+1].sum; 13 return ; 14 } 15 void push_down(int p) 16 { 17 if(t[p].l==t[p].r||t[p].lazy==0) return ; 18 t[p<<1].lazy+=t[p].lazy; 19 t[p<<1].sum+=t[p].lazy*(t[p<<1].r-t[p<<1].l+1); 20 t[(p<<1)+1].lazy+=t[p].lazy; 21 t[(p<<1)+1].sum+=t[p].lazy*(t[(p<<1)+1].r-t[(p<<1)+1].l+1); 22 t[p].lazy=0; 23 } 24 void build_tree(int p,int l,int r) 25 { 26 t[p].l=l;t[p].r=r;t[p].lazy=0; 27 if(l==r) 28 { 29 t[p].sum=a[l]; 30 return; 31 } 32 int mid=(l+r)>>1; 33 build_tree(p<<1,l,mid); 34 build_tree((p<<1)+1,mid+1,r); 35 push_up(p); 36 } 37 void modify(int p,int l,int r,long long w) 38 { 39 push_down(p); 40 if(l==t[p].l&&r==t[p].r) 41 { 42 t[p].sum+=(r-l+1)*w; 43 t[p].lazy=w; 44 return ; 45 } 46 int mid=(t[p].l+t[p].r)>>1; 47 if(mid>=r) modify(p<<1,l,r,w); 48 else if(mid<l) modify((p<<1)+1,l,r,w); 49 else modify(p<<1,l,mid,w),modify((p<<1)+1,mid+1,r,w); 50 push_up(p); 51 } 52 long long query(int p,int l,int r) 53 { 54 push_down(p); 55 if(l==t[p].l&&r==t[p].r) 56 { 57 return t[p].sum; 58 } 59 int mid=(t[p].l+t[p].r)>>1; 60 if(mid>=r) return query(p<<1,l,r); 61 if(mid<l) return query((p<<1)+1,l,r); 62 return query(p<<1,l,mid)+query((p<<1)+1,mid+1,r); 63 } 64 int main() 65 { 66 scanf("%d%d",&n,&m); 67 for(int i=1;i<=n;i++) scanf("%lld",&a[i]); 68 build_tree(1,1,n); 69 long long w; 70 for(int i=1,p,l,r;i<=m;i++) 71 { 72 scanf("%d",&p); 73 if(p==1) 74 { 75 scanf("%d%d%lld",&l,&r,&w); 76 modify(1,l,r,w); 77 } 78 else { 79 scanf("%d%d",&l,&r); 80 printf("%lld ",query(1,l,r)); 81 } 82 } 83 return 0; 84 }