Cod sursa(job #587763)

Utilizator proflaurianPanaete Adrian proflaurian Data 5 mai 2011 20:01:40
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
//#include<ctime>
#define N 1<<17
int n,q,i,x,v,w,k,s[N];
int main()
{
	//double start=(double)clock(),cps=(double)CLOCKS_PER_SEC,end;
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d",&n,&q);w=N;w--;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		for(v=i;v&w;){s[v]+=x;v+=(v&-v);}
	}
	for(;q;q--)
	{
		scanf("%d",&k);
		if(!k)
		{
			scanf("%d%d",&v,&x);
			for(;v&w;){s[v]+=x;v+=(v&-v);}
			continue;
		}
		if(k==1)
		{
			x=0;
			scanf("%d",&v);for(v--;v;){x-=s[v];v-=(v&-v);}
			scanf("%d",&v);for(;v;){x+=s[v];v-=(v&-v);}
			printf("%d\n",x);continue;
		}
		scanf("%d",&x);
		for(i=0,v=N;v&&x;v>>=1)
			if(i+v<=n&&x>=s[i+v])
				{i+=v;x-=s[i];}
		x?printf("-1\n"):printf("%d\n",i);
	}/*
		
		int i, step;
for ( step = 1; step < N; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
 if( i + step <= N)
065.{
066.if( val >= Arb[i+step] )
067.{
068.i += step, val -= Arb[i];
069.if ( !val ) return i;
070.}
071.}
072.}
	}
	printf("%d\n",sol);*/
	//end=(double)clock();
	//printf("%lf\n",(end-start)/cps);
	return 0;
}