Cod sursa(job #433263)

Utilizator O_NealS. Alex O_Neal Data 3 aprilie 2010 15:14:39
Problema Arbori indexati binar Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include<cstdio>
#include<fstream>
using namespace std;


int ai[210000],a,b,val,poz,SUMA,k,n;

void adauga(int nod, int s, int d)
{
	if(s==d) ai[nod]+=val;
	else
	{
		int m=(s+d)/2;
		ai[nod]+=val;
		if(poz<=m) adauga(nod*2,s,m);
		else adauga(nod*2+1,m+1,d);		
	}
}

void suma(int nod, int s, int d)
{
	if(a<=s && d<=b) SUMA+=ai[nod];
	else
	{
		int m=(s+d)/2;
		if(a<=m) suma(nod*2,s,m);
		if(b>m) suma(nod*2+1,m+1,d);
	}
}
		
void kmin(int nod, int s, int d)
{
	if(ai[nod]==a) k=d;
	else if(s==d && a!=ai[nod]) k=-1;
	else if(nod<=n) 
	{
		int m = (s+d)/2;
		if(ai[nod*2]>a ) kmin(nod*2,s,m); 
		else
		{
			a-=ai[nod*2];
			k=m;
			if(a>0) kmin(nod*2+1,m+1,d);
		}
	}
}
int main()
{
	ifstream fin("aib.in");
	freopen("aib.out","w",stdout);
	int m,x;
	fin>>n>>m;
	for(int i=1; i<=n; ++i)
	{
		fin>>x;
		val=x;
		poz=i;
		adauga(1,1,n);
	}
	for(int i=1; i<=m; ++i)
	{
		fin>>x>>a;
		if(x==0)
		{
			fin>>b;
			val=b;
			poz=a;
			adauga(1,1,n);
		}
		else if(x==1)
		{
			fin>>b;
			SUMA=0;
			suma(1,1,n);
			printf("%d\n",SUMA);
		}
		else
		{
			kmin(1,1,n);
			printf("%d\n",k);
		}
		//printf("\n\n\n%d",ai[1]);
	}
	return 0;
}