Cod sursa(job #754583)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 2 iunie 2012 17:16:17
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
#include<algorithm>
#define pow_zr(x) ((x^(x-1))&x)
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");

int aib[100001], val, n, m, op, poz, cst, cdr, k, x;
//Adaugare
void Update(int ind, int val)
{
	for ( int j = ind; j <= n; j += pow_zr(j) )
	{
		aib[j] += val;
	}
}
//Suma
int Sum(int ind)
{
	int sum = 0;
	for ( int j = ind; j > 0; j -= pow_zr(j) )
	{
		sum += aib[j];
	}
	return sum;
}

//Cautare
int Search(int val)
{
    int i, step;
    for ( step = 1; step < n; step <<= 1 ); 
    for( i = 0; step; step >>= 1 )
    {
         if( i + step <= n)
         {
            if( val >= aib[i+step] ) 
            {
                i += step, val -= aib[i];
                if ( !val ) return i;
            }
         }
    }
    return -1;
}
int main()
{
	int i;
	fin >> n >> m;
	for ( i = 1; i <= n; i++ )
	{
		fin >> val;
		Update(i,val);
	}
	for( i = 1; i <= m; i++ )
	{
		fin >> op;
		if ( op == 0 )
		{
			fin >> poz >> x;
			Update(poz,x);
		}
		if ( op == 1 )
		{
			fin >> cst >> cdr;
			fout << Sum(cdr) - Sum(cst-1) << '\n';
		}
		if ( op == 2 )
		{
			fin >> k;
			fout << Search(k) << '\n';
		}
	}
	fin.close();
	fout.close();
	return 0;
}