#include<iostream>
#include<stdio.h>
#include<string.h>
#include<cmath>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MAX 100010
using namespace std;
struct node
{
int l,r;
long long int sum;
}a[MAX*3];
long long int ant[MAX];
void build(int t, int l, int r)
{
a[t].l=l;
a[t].r=r;
if(l==r)
{
a[t].sum=ant[l];
return;
}
int mid=(l+r)>>1;
build(L(t),l,mid);
build(R(t),mid+1,r);
a[t].sum=a[L(t)].sum+a[R(t)].sum;
}
void update(int t,int x,long long int val)
{
if(x<=a[t].l&&a[t].r<=x)
{
a[t].sum=val;
return;
}
if(a[t].l==a[t].r)return;
int mid=(a[t].r+a[t].l)>>1;
if(x<=mid)
update(L(t),x,val);
if(x>mid)
update(R(t),x,val);
a[t].sum=a[L(t)].sum+a[R(t)].sum;
}
int query(int t,long long int x)
{
if(a[t].l==a[t].r)
return a[t].l;
if(a[L(t)].sum>=x)
return query(L(t),x);
else
return query(R(t),x-a[L(t)].sum);
}
int main()
{
int m,n,i,j;
int x;
long long int val;
char s[2];
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%lld",&ant[i]);
build(1,1,n);
scanf("%d",&m);
while(m--)
{
scanf("%s",s);
if(s[0]=='q')
{
scanf("%lld",&val);
printf("%d\n",query(1,val));
}
else
{
scanf("%d%lld",&x,&val);
update(1,x,val);
}
}
}
}zoj3279
最新推荐文章于 2015-11-14 11:20:51 发布
2918

被折叠的 条评论
为什么被折叠?



