zoj3279
来源:互联网 发布:粤语 知乎 编辑:程序博客网 时间:2024/05/21 22:49
#include<iostream>#include<stdio.h>#include<string.h>#include<cmath>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MAX 100010using 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); } } }}