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);            }        }            }}