Cod sursa(job #602365)

Utilizator proflaurianPanaete Adrian proflaurian Data 11 iulie 2011 07:58:49
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.71 kb
#include<cstdio>
int n,t,i,a,b,c,V,A,LIM,v[132000];
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);for(a=i;a<=LIM;){v[a]+=V;A=a&(-a);a+=A;}}
	for(;t;t--)
	{
		scanf("%d",&c);
		if(!c)
		{
			scanf("%d%d",&a,&b);
			for(;a<=LIM;){v[a]+=b;A=a&(-a);a+=A;}
			continue;
		}
		if(c==1)
		{
			V=0;scanf("%d%d",&a,&b);a--;
			for(;a;){A=a&(-a);V-=v[a];a-=A;}
			for(a=b;a;){A=a&(-a);V+=v[a];a-=A;}
			printf("%d\n",V);
			continue;
		}
		scanf("%d",&V);
		for(a=0,b=LIM;b;b>>=1)
		{
			if(a+b<=n&&V>=v[a+b]){a+=b;V-=v[a];}
			if(!V)break;
		}
		V?printf("-1\n"):printf("%d\n",a);
	}
}