Cod sursa(job #754580)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 2 iunie 2012 17:07:28
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 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, b[100001];
//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);
		b[i] = Sum(i);
	}
	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 <<lower_bound(b+1,b+n,k)-b << '\n';
		}
	}
	fin.close();
	fout.close();
	return 0;
}