Cod sursa(job #1459832)

Utilizator ArkinyStoica Alex Arkiny Data 10 iulie 2015 22:21:32
Problema Arbori indexati binar Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<fstream>
using namespace std;

#define MAX 100001

int AIB[MAX],N,M;

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

void modify(int p,int value)
{
	while(p <=N)
	{
		AIB[p]+=value;
		p+=p&(-p);
	}
}

int get_Sum(int p)
{
	int S=0;
	while(p)
	{
		S+=AIB[p];
		p-=p&(-p);
	}
	return S;
}

int main()
{
	in>>N>>M;
	int el;
	for(int i=1;i<=N;i++)
	{
		in>>el;
		modify(i,el);
	}
	int op,a,b;
	for(int i=1;i<=M;i++)
	{
	   in>>op;
	   if(op==0)
	   {
		   in>>a>>b;
		   modify(a,b);
	   }
	   else if(op==1)
	   {
		   in>>a>>b;
		   out<<get_Sum(b) -  get_Sum(a-1)<<endl;
	   }
	   else
	   {
		   in>>a;
		   int l=1,r=N,mij,S;
		   int k=1<<30;
		   while(l<=r)
		   {
			   mij=(l+r)/2;
			   S=get_Sum(mij);
			   if(S==a)
			   {
				   k=mij;
				   r=mij-1;
			   }
			   else if(S < a)
				   l=mij+1;
			   else
				   r=mij-1;
		   }
		   if(k==1<<30)
			   out<<-1<<endl;
		   else
			   out<<k<<endl;
	   }
	}
	return 0;
}