Cod sursa(job #974821)

Utilizator Kira96Denis Mita Kira96 Data 18 iulie 2013 13:36:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
#define NM 100100
using namespace std;
ifstream f("aib.in");
ofstream g("aib.out");
int n,m,A[NM],i,t,x,a,b,k;
int sum(int st,int dr);
void update(int poz,int x);
int find(int x);
int main ()
{
	f>>n>>m;
	for(i=1;i<=n;++i)
	{
		f>>x;
		update(i,x);
	}
	for(i=1;i<=m;++i)
	{
		f>>t;
		if(t==0)
		{
			f>>a>>b;
			update(a,b);
		}
		else
		if(t==1)
		{
			f>>a>>b;
			g<<sum(a,b)<<"\n";
		}
		else
		{
			f>>a;
			g<<find(a)<<"\n";
		}
	}
	return 0;
}
void update(int poz,int x)
{
	int t;
	while(poz<=n)
	{
		A[poz]+=x;
		t=1;
		while(!(poz&t)) t<<=1;
		poz+=t;
	}
}
int sum(int st,int dr)
{
	int S=0,t;
	while(dr>=1)
	{
		S+=A[dr];
		t=1;
		while(!(dr&t))t<<=1;
		dr-=t;
	}
	st--;
	while(st>=1)
	{
		S-=A[st];
		t=1;
		while(!(st&t))t<<=1;
		st-=t;
	}
	return S;
}
int find(int x)
{
	int t;
	t=1;
	for(;t<=n;t<<=1);
	for(k=0;t;t>>=1)
	{
		if(k+t<=n)
		{
			if(x>=A[k+t])
			{
				k+=t,x-=A[k];
				if(!x) return k;
			}
		}
	}
	return -1;
}