POJ A Simple Problem with Integers | 线段树基础练习
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 typedef long long ll; 5 #define N 100010 6 using namespace std; 7 struct node 8 { 9 ll l,r,lz,sum; 10 }t[4*N]; 11 ll read() 12 { 13 ll ret=0,neg=1; 14 char j=getchar(); 15 for (;j>'9' || j<'0';j=getchar()) 16 if (j=='-') neg=-1; 17 for (;j<='9' && j>='0';j=getchar()) 18 ret=ret*10+j-'0'; 19 return ret*neg; 20 } 21 ll n,q,a[N],l,r,k; 22 void pushup(ll p) 23 { 24 t[p].sum=t[2*p].sum+t[2*p+1].sum; 25 } 26 void pushdown(ll p) 27 { 28 if (t[p].l==t[p].r || t[p].lz==0) return; 29 ll tmp=t[p].lz,mid=(t[p].r+t[p].l)>>1; 30 t[2*p].sum+=(mid-t[p].l+1)*tmp; 31 t[2*p+1].sum+=(t[p].r-mid)*tmp; 32 t[2*p].lz+=tmp; 33 t[2*p+1].lz+=tmp; 34 t[p].lz=0; 35 } 36 void build(ll p,ll l,ll r) 37 { 38 t[p].l=l,t[p].r=r; 39 if (l!=r) 40 { 41 ll mid=l+r>>1; 42 build(2*p,l,mid); 43 build(2*p+1,mid+1,r); 44 pushup(p); 45 } 46 else 47 t[p].sum=a[l]; 48 } 49 void modify(ll p,ll l,ll r,ll k) 50 { 51 ll L=t[p].l,R=t[p].r,mid=(L+R)>>1; 52 if (l==L && r==R) 53 { 54 t[p].sum+=(r-l+1)*k; 55 t[p].lz+=k; 56 return ; 57 } 58 pushdown(p); 59 if (r<=mid) 60 modify(2*p,l,r,k); 61 else if (l>mid) 62 modify(2*p+1,l,r,k); 63 else modify(2*p,l,mid,k),modify(2*p+1,mid+1,r,k); 64 pushup(p); 65 } 66 ll query(ll p,ll l,ll r) 67 { 68 ll L=t[p].l,R=t[p].r,mid=(L+R)>>1; 69 if (l==L && r==R) 70 return t[p].sum; 71 pushdown(p); 72 if (r<=mid) 73 return query(2*p,l,r); 74 if (l>mid) return query(2*p+1,l,r); 75 return query(2*p,l,mid)+query(2*p+1,mid+1,r); 76 } 77 char op[N]; 78 int main() 79 { 80 n=read(),q=read(); 81 for (int i=1;i<=n;i++) 82 a[i]=read(); 83 build(1,1,n); 84 while (q--) 85 { 86 scanf("%s",op); 87 if (op[0]=='Q') 88 l=read(),r=read(),printf("%lld\n",query(1,l,r)); 89 else l=read(),r=read(),k=read(),modify(1,l,r,k); 90 } 91 return 0; 92 }