//单点修改 区间求和
#define Max 41234
int ans;int data[Max],sum[4*Max];
void creat(int l,int r,int root)
{
if(l==r)
{
sum[root]=data[l];//更新叶子节点
return ;
}
int mid=(l+r)/2;
creat(l,mid,root*2);
creat(mid+1,r,root*2+1);
sum[root]=sum[root*2]+sum[root*2+1];//更新父亲节点
}
void update(int L,int c,int l,int r,int root)
{
if(l==r)
{
sum[root]+=c;
return ;
}
int mid=(l+r)/2;
if(L<=mid)
update(L,c,l,mid,root*2);
else
update(L,c,mid+1,r,root*2+1);
sum[root]=sum[root*2]+sum[root*2+1];
}
void Query(int L,int R,int l,int r,int root)
{
if(L<=l&&R>=r)
{
ans+=sum[root];
return;
}
int mid=(l+r)/2;
if(L<=Mid)
Query(L,R,l,r,root*2);
if(R>mid)
Query(L,R,l,r,root*2+1);
}
//单点修改 区间找最值
void creat(int l,int r,int root)
{
if(l==r)
{
sum[root]=data[i];
return ;
}
int mid=(l+r)/2;
creat(l,mid,root*2);
creat(mid+1,r,root*2+1);
sum[root]=max(sum[root*2],sum[root*2+1])//最小也一样
}
void update(int L,int c,int l,int r,int root)
{
if(l==r)
{
sum[root]=c;
return;
}
int mid=(l+r)/2;
if(L<=mid)
update(L,c,l,mid,root*2);
else
update(L,c,mid+1,r,root*2+1);
sum[root]=max(sum[root],sum[root*2+1]);
}
void Query(int L,int R,int l,int r,int root)
{
if(L<=l&&R>=r)
{
ans=max(ans,sum[root]);
}
int mid=(l+r)/2;
if(L<=mid)
Query(L,R,l,mid,root*2);
if(R>mid)
Query(L,R,mid+1,r,root*2+1);
}