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 }.
Input
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 }.
Output
For each query, print an integer as the problem required.
Example
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;
}