You are given a sequence A of N (N <= 50000) integers between -10000 and 10000. On this sequence you have to apply M (M <= 50000) operations:
modify the i-th element in the sequence or for given x y print max{Ai + Ai+1 + .. + Aj | x<=i<=j<=y }.
The first line of input contains an integer N. The following line contains N integers, representing the sequence A1..AN.
The third line contains an integer M. The next M lines contain the operations in following form:
0 x y: modify Ax into y (|y|<=10000).
1 x y: print max{Ai + Ai+1 + .. + Aj | x<=i<=j<=y }.
For each query, print an integer as the problem required.
Input: 4 1 2 3 4 4 1 1 3 0 3 -3 1 2 4 1 3 3 Output: 6 4 -3
题意
维护一个数列a[1], a[2], ..., a[N] . (|a[i]| ≤ 10000, 1 ≤ N ≤ 50000)。
有两种共M个操作(M <= 50000):Modify(i, x) 把a[i]改成x;Query(x, y) = max{a[i] + a[i + 1] + ... + a[j]; x ≤ i ≤ j ≤ y}。
题解
只比GSS1多了修改。
#include<iostream> #include<cstdio> #include<cmath> #define maxn 50005 #define inf 1000000000 #define lc root<<1 #define rc root<<1|1 using namespace std; int a[maxn]; struct tree { int maxs,maxl,maxr,alls; tree(int x=0) { maxs=maxl=maxr=alls=x; } }data[maxn<<2]; tree update(tree a,tree b) { tree ret; ret.alls=a.alls+b.alls; ret.maxs=max(a.maxr+b.maxl,max(a.maxs,b.maxs)); ret.maxl=max(a.maxl,a.alls+b.maxl); ret.maxr=max(b.maxr,b.alls+a.maxr); return ret; } void build(int root,int l,int r) { if(l==r) { data[root]=tree(a[l]);return; } int mid=(l+r)>>1; build(lc,l,mid); build(rc,mid+1,r); data[root]=update(data[lc],data[rc]); } void modify(int root,int l,int r,int id ,int val) { if(l==r) { data[root]=tree(val);return; } int mid=(l+r)>>1; if(id<=mid) modify(lc,l,mid,id,val); else modify(rc,mid+1,r,id,val); data[root]=update(data[lc],data[rc]); } tree find(int root,int aa,int bb,int l,int r) { if(l<=aa&&r>=bb) return data[root]; tree x=tree(-inf),y=tree(-inf); x.alls=0;y.alls=0; int mid=(aa+bb)>>1; if(l<=mid) x=find(lc,aa,mid,l,r); if(r>mid) y=find(rc,mid+1,bb,l,r); return update(x,y); } int main() { int n,m,i,j,x,y,f; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); build(1,1,n); scanf("%d",&m); while(m--) { scanf("%d%d%d",&f,&x,&y); if(f==1) printf("%d\n",find(1,1,n,x,y).maxs); else { modify(1,1,n,x,y); } } } return 0; }