标签:point else print ++ oid scanf name int main
1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 struct T{ 5 int l,r,v,tag; 6 }t[4*100001]; 7 int n,m,l,r,c,opt,a[100001]; 8 int build(int x,int l,int r) 9 { 10 t[x].l=l;t[x].r=r;t[x].tag=0; 11 if (l==r) return t[x].v=a[l]; 12 int m=(l+r)/2; 13 return t[x].v=max(build(x*2,l,m),build(x*2+1,m+1,r)); 14 } 15 void pushdown(int x) 16 { 17 if (t[x].tag==0) return; 18 t[x*2].v+=t[x].tag; 19 t[x*2+1].v+=t[x].tag; 20 t[x*2].tag+=t[x].tag; 21 t[x*2+1].tag+=t[x].tag; 22 t[x].tag=0; 23 } 24 int query(int x,int l,int r) 25 { 26 if (t[x].l==l&&t[x].r==r) return t[x].v; 27 pushdown(x); 28 int m=(t[x].l+t[x].r)/2; 29 if (r<=m) return query(x*2,l,r); 30 else if (l>=m+1) return query(x*2+1,l,r); 31 else return max(query(x*2,l,m),query(x*2+1,m+1,r)); 32 } 33 int update(int x,int l,int r,int v)//segment 34 { 35 if (t[x].l==l&&t[x].r==r){t[x].tag+=v;return t[x].v+=v;} 36 pushdown(x); 37 int m=(t[x].l+t[x].r)/2; 38 if (r<=m) return t[x].v=max(t[x*2+1].v,update(x*2,l,r,v)); 39 else if (l>=m+1) return t[x].v=max(t[x*2].v,update(x*2+1,l,r,v)); 40 else return t[x].v=max(update(x*2,l,m,v),update(x*2+1,m+1,r,v)); 41 } 42 /* 43 int update(int x,int l,int v)//point 44 { 45 if (t[x].l==t[x].r) return t[x].v=v; 46 int m=(t[x].l+t[x].r)/2; 47 if (l<=m) return t[x].v=max(t[x*2+1].v,update(x*2,l,v)); 48 if (l>=m+1) return t[x].v=max(t[x*2].v,update(x*2+1,l,v)); 49 } 50 */ 51 int main() 52 { 53 scanf("%d",&n); 54 for (int i=1;i<=n;i++) scanf("%d",&a[i]); 55 build(1,1,n); 56 scanf("%d",&m); 57 for (int i=1;i<=m;i++) 58 { 59 scanf("%d%d%d",&opt,&l,&r); 60 if (opt==1) 61 { 62 scanf("%d",&c); 63 update(1,l,r,c); 64 } 65 if (opt==2) printf("%d\n",query(1,l,r)); 66 } 67 }
标签:point else print ++ oid scanf name int main
原文地址:http://www.cnblogs.com/algonote/p/7586237.html