Cod sursa(job #754577)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 2 iunie 2012 16:57:35
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
#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;
}

int main()
{
	int i, j;
	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;
			for ( j = 1; j <= n; j++ )
			{
				if ( Sum(j) == k )
				{
					fout << j << '\n';
					break;
				}
			}
			if ( j == n+1 )
			{
				fout << -1 << '\n';
			}
		}
	}
	fin.close();
	fout.close();
	return 0;
}