线段树纯水题
#include<stdio.h>
#include<iostream>
using namespace std;
#define ls (rt<<1)
#define rs ((rt<<1)|1)
#define mid ((l+r)>>1)
#define maxn 111111
int sum[maxn<<2],x;
void pushup(int rt,int l,int r){sum[rt]=sum[ls]+sum[rs];}
void build(int rt,int l,int r)
{
if(l==r)
{
scanf("%d",&sum[rt]);
return ;
}
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt,l,r);
}
void ins(int rt,int l,int r,int L,int R,int w)
{
if(l==r)
{
sum[rt]=w;
return ;
}
if(L<=mid)ins(ls,l,mid,L,R,w);
if(mid<R)ins(rs,mid+1,r,L,R,w);
pushup(rt,l,r);
}
int query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R){return sum[rt];}
int ans=0;
if(L<=mid)ans+=query(ls,l,mid,L,R);
if(mid<R)ans+=query(rs,mid+1,r,L,R);
return ans;
}
int binary(int w,int n)
{
int l=1,r=n,fu=n;
while(l<=r)
{
int ans=query(1,1,n,1,mid);
if(ans==w)return mid;
if(ans>w){fu=mid;r=mid-1;}
else
l=mid+1;
}
return fu;
}
int main()
{
int n,m,a,b;
char op[5];
while(~scanf("%d",&n))
{
build(1,1,n);
scanf("%d",&m);
while(m--)
{
scanf("%s",op);
if(op[0]=='q')
{
scanf("%d",&a);
printf("%d\n",binary(a,n));
}
else
{
scanf("%d%d",&a,&b);
ins(1,1,n,a,a,b);
}
}
}
return 0;
}