Cod sursa(job #641798)

Utilizator Tucu94Andrei Tuculanu Tucu94 Data 29 noiembrie 2011 16:47:16
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include<fstream>
#define formula(x)(x&-x)
using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");



int t,N,M,AIB[100001],v,a,b,A,B,P,V,i,q,j;

void update(int poz,int val)
{
	int i;
	for(i=poz ; i <=N ; i+=formula(i))
		AIB[i]+=val;
}
int querry(int a)
{
	int s=0;
	for(i=a;i>0;i-=formula(i))
		s+=AIB[i];
	return s;

}
int search(int val)
{
	int steps = 1;
	for(;steps < N;steps<<=1);

	for(int i = 0;steps;steps>>=1)
	{
		if(i + steps<=N)
		{
			if(val >= AIB[i+steps])
			{
			i += steps , val -= AIB[i];
			if(!val) return i;
			}
		}
	}
	return -1;
}
int main (){

	f>>N>>M;
	for(i=1;i<=N;i++)
	{
		f>>t;
		update(i,t);
	}

	for(j=1;j<=M;j++){
		f>>q;
		if(q==0) 
			{
			f>>P>>V;
			update(P,V);
			}
		if(q==1)
			{
			f>>a>>b;
			A=querry(a-1);
			B=querry(b);
			g<<B-A<<"\n";
			}
		if(q==2)
			{
				f>>V;
				g<<search(V)<<'\n';
			}
	}
	
return 0;
}