Cod sursa(job #602369)

Utilizator proflaurianPanaete Adrian proflaurian Data 11 iulie 2011 08:43:13
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#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;}