Cod sursa(job #571331)

Utilizator tinkyAndrei Ilisei tinky Data 4 aprilie 2011 12:21:23
Problema Arbori indexati binar Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<fstream>
#define zeros(x) ( (x ^ (x - 1)) & x )
using namespace std;
int aib[15010],v[15010];
int n,m;
//functia incrementeaza v[x] cu 'val' in arborele indexat binar
void add(int x,int val)
{
	int i;
	for (i=x;i<=n;i+=zeros(i))
		aib[i]+=val;
}
//calculeaza suma elementelor pe intervalul [1,x]
int suminterval(int x)
{
	int i,s=0;
	for (i=x;i>0;i-=zeros(i))
		s+=aib[i];
	return s;
}
int cauta(int val)
{
	int i,pas;
	for (pas=1;pas<n;pas<<=1);
	for (i=0;pas;pas>>=1)
	{
		if (i+pas<=n&&val>=aib[i+pas])
		{
			i+=pas;
			val-=aib[i];
			if (!val)
				return i;
		}
	}
	return -1;
}
int main()
{
	int i,op,k,j,s;
	ifstream in("aib.in");
	in>>n>>m;
	for (i=1;i<=n;i++)
	{
		in>>v[i];
		add(i,v[i]);
	}
	ofstream out("aib.out");
	for (i=1;i<=m;i++)
	{
		in>>op>>k;
		if (op==1)
		{
			in>>j;
			s=suminterval(j);
			s-=suminterval(k-1);
			out<<s<<'\n';
		}
		else if (op==0)
		{
			in>>j;			
			add(k,j);	
			v[k]+=j;			
		}
		else
			out<<cauta(k)<<'\n';		
	}
}