Cod sursa(job #428340)

Utilizator mottyMatei-Dan Epure motty Data 29 martie 2010 10:13:00
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>

const int N=100001;

int n,m,v[N];

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

void up( int poz , int val )
{
	while( poz<=n )
	{
		v[poz]+=val;
		poz+=f(poz);
	}
}

int querry(int x)
{
	int s=0;
	while(x)
	{
		s+=v[x];
		x-=f(x);
	}
	return s;
}

void sum( int x,int y )
{
	printf("%d\n", querry(y)-querry(x-1) );
}

void caut( int x )
{
	int i,step;
	for( step=1 ; step<=n ; step<<=1 );
	for( i=1 ; step ; step>>=1 )
		if( i+step<=n && querry(i+step)<=x )
			i+=step;
	printf("%d\n",i);
}

void initialise()
{
	int x;
	scanf("%d%d",&n,&m);
	for( int i=1 ; i<=n ; ++i )
	{
		scanf("%d",&x);
		up(i,x);
	}
}

void solve()
{
	int x,y,z;
	while(m--)
	{
		scanf("%d",&x);
		if(x==0)
		{
			scanf("%d%d",&y,&z);
			up(y,z);
		}
		if(x==1)
		{
			scanf("%d%d",&y,&z);
			sum(y,z);
		}
		if(x==2)
		{
			scanf("%d",&y);
			caut(y);
		}
	}
}

int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	initialise();
	solve();
	return 0;
}