Cod sursa(job #563836)

Utilizator avram_florinavram florin constantin avram_florin Data 26 martie 2011 10:19:52
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include<fstream>
#include<cstdio>

using namespace std;

const int MaxN = 100001;
const char in[] = "aib.in";
const char out[] = "aib.out";

int n,m,Arb[MaxN];

void update(int poz,int val)
{
	int p = 0;
	while( poz <= n )
		{
			Arb[poz] += val;
			while( !(poz & (1<<p)) )
				p++;
			poz += (1<<p);
			p++;
		}
}

int query(int poz)
{
	int p = 0, S = 0;
	while( poz )
		{
			S += Arb[poz];
			while( !(poz & (1<<p) ) )
				p++;
			poz -= (1<<p);
			p++;
		}
	return S;
}

int Binary_search(int val)
{
	int i,step;
	for( step = 1 ; step < n ; step = step << 1 );
	for( i = 0 ; step ; step = step >> 1 )
		if( i+step <= n )
			if( val >= Arb[i+step] )
				{
					val -= Arb[i+step];
					i += step;
					if( !val )
						return i;
				}
	return -1;
}

int main()
{
	freopen ( in , "r" , stdin );
	freopen ( out , "w" , stdout );
	scanf("%d%d" , &n , &m );
	int i,op,ind,v,st,dr;
	for( i = 1 ; i <= n ; i++ )
		{
			scanf("%d" , &v );
			update(i,v);
		}
	for( i = 1 ; i <= m ; i++ )
		{
			scanf("%d" , &op);
			if( !op )
				{
					scanf("%d%d" , &ind , & v);
					update(ind,v);
				}
				else
				if( op == 1 )
				{
					scanf ("%d%d" , &st , &dr);
					printf("%d\n" , query(dr) - query(st-1) );
				}
				else
				{
					scanf("%d" , &v);
					printf("%d\n" , Binary_search(v));
				}
		}
	return 0;
}