Cod sursa(job #545420)

Utilizator irene_mFMI Irina Iancu irene_m Data 3 martie 2011 12:03:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#define MaxN 100005
#define infile "aib.in"
#define outfile "aib.out"

int N,M,c[MaxN],i,s,s1,s2,op,a,b,k;

int bit(int x)
{
	return (x & (x-1)) ^ x;
}

void Update(int poz,int val)
{
	while(poz<=N)
	{
		c[poz]+=val;
		poz+=bit(poz);
	}
}	

void Query(int poz)
{
	while(poz>0)
	{
		s+=c[poz];
		poz-=bit(poz);
	}
}

int Search(int a)
{
	int i,step;
	
	for(step=1; step<N; step<<=1);
	
	for(i=0; step; step>>=1)
		if(step+i<=N)
			if(a>=c[i+step])
			{
				i+=step; a-=c[i];
				if(!a) return i;
			}
	return -1;
}
	

int main()
{
	freopen(infile,"r",stdin);
	freopen(outfile,"w",stdout);
	
	scanf("%d%d",&N,&M);
	
	for(i=1;i<=N;i++)
	{
		scanf("%d",&s);
		Update(i,s);
	}
	
	for(i=1;i<=M;i++)
	{
		scanf("%d",&op);
		if(!op)
		{
			scanf("%d%d",&a,&b);
			Update(a,b);
		}
		else
			if(op==1)
			{
				scanf("%d%d",&a,&b);
				s=0;
				Query(a-1); s1=s;
				s=0;
				Query(b); s2=s;
				printf("%d\n",s2-s1);
			}
			else
			{
				scanf("%d",&a);
				printf("%d\n",Search(a));
			}
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}