Pagini recente » Cod sursa (job #3253424) | Cod sursa (job #2357402) | Cod sursa (job #36278) | Cod sursa (job #2838097) | Cod sursa (job #602369)
Cod sursa(job #602369)
#include<cstdio>
int n,t,i,a,b,c,V,A,ST,DR,MI,LIM,v[132000];
int get_val(int);
void upd(int,int);
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&t);
for(LIM=1;LIM<=n;LIM<<=1);
for(i=1;i<=n;i++){scanf("%d",&V);upd(i,V);}
for(;t;t--)
{
scanf("%d",&c);
if(!c){scanf("%d%d",&a,&b);upd(a,b);continue;}
if(c==1){scanf("%d%d",&a,&b);printf("%d\n",get_val(b)-get_val(a-1));continue;}
scanf("%d",&V);
ST=0;DR=n+1;
for(;DR-ST-1;){MI=(ST+DR)>>1;if(get_val(MI)<V)ST=MI;else DR=MI;}
if(DR==n+1){printf("-1\n");continue;}if(get_val(DR)!=V){printf("-1\n");continue;}
printf("%d\n",DR);
}
}
int get_val(int poz){int ret=0;for(;poz;poz-=(poz&(-poz)))ret+=v[poz];return ret;}
void upd(int poz,int val){for(;poz<=LIM;poz+=(poz&(-poz)))v[poz]+=val;}