Cod sursa(job #174577)

Utilizator cretuMusina Rares cretu Data 8 aprilie 2008 23:31:41
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#define bit(x) ((x&(x-1))^(x))

using namespace std;

int n, sum[100001];

void Add(int x, int v)
{
	int i;
	for (i = x; i <= n; i += bit(i))
		sum[i] += v;
}

int Suma(int x)
{
	int i, rez = 0;
	for (i = x; i > 0; i -= bit(i))
		rez += sum[i];
	return rez;
}

int main()
{
	int i, m, op, x, y, mij, st, dr, ok, v, s1, s2;

	ifstream fin("aib.in");
	ofstream fout("aib.out");

	fin >> n >> m;
	for (i = 1; i <= n; i++)
	{
		fin >> v;
		Add(i, v);
	}
	
	for (; m; m--)
	{
		fin >> op;
		if (op == 0) 
		{
			fin >> x >> y;
			Add(x, y);			
		}
		else if (op == 1) 
			 {	
			 	fin >> x >> y;
				s1 = Suma(y);
				s2 = Suma(x-1);
				fout << s1-s2 << "\n";
			 }
			 else if (op == 2)
				  {
				  	  fin >> x;
					  st = 1;
					  dr = n;
					  ok = 0;	  
				  	  
					  while (st <= dr)	
					  {
					  	  mij = (st + dr)>>1;
		  				  v = Suma(mij); 
						  if (v == x) 
						  {
						      ok = 1;
							  fout << mij << "\n";
							  break;
						  } 
						  if (v < x) st = mij+1;					  
						  else       dr = mij-1;								  
					  }	
					  if (!ok) fout << "-1\n";
				  }	 	
	}
	fin.close();

	return 0;
}