Cod sursa(job #432002)

Utilizator vladbBogolin Vlad vladb Data 1 aprilie 2010 18:46:41
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<fstream>

#define maxn 100001

using namespace std;

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

int n,m,poz;
int c[maxn];

void modifica(int ind,int val)
{	poz=0;
	while(ind<=n)
	{	c[ind]+=val;
		while(!(ind & (1<<poz)))
			poz++;
		ind+=(1<<poz);
		poz++;
	}
}

int suma(int ind)
{	int s=0;
	poz=0;
	while(ind>0)
	{	s+=c[ind];
		while(!(ind &(1<<poz))) 
			poz++;
		ind-=(1<<poz);
		poz+=1;
	}
	return s;
}

int cauta(int sum)
{	int i,pas;
	for(pas=1;pas<n;pas<<=1);
	for(i=0;pas;pas>>=1)
	{	if(i+pas<=n)
		{	if(sum>=c[i+pas])
			{	i+=pas;
				sum-=c[i];
				if(sum==0) return i;
			}
		}
	}
	return -1;
}

int main()
{	int i,x,y,k;
	fin>>n>>m;
	for(i=1;i<=n;i++)
	{	fin>>x;
		modifica(i,x);
	}
	for(i=1;i<=m;i++)
	{	fin>>k;
		if(k!=2)
		{	fin>>x>>y;
			if(k==1) fout<<suma(y)-suma(x-1)<<"\n";
			else modifica(x,y);
		}
		else 
		{	fin>>x;
			fout<<cauta(x)<<"\n";
		}
	}
	fin.close();
	fout.close();
	return 0;
}