Cod sursa(job #429561)

Utilizator hadesgamesTache Alexandru hadesgames Data 30 martie 2010 11:43:52
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>
FILE *in,*out;
int aib[100005],n;
int bit (int x)
{
	 return (x&(x-1))^x;
}
void update(int poz,int val)
{
	for (;poz<=n;poz+=bit(poz))
		aib[poz]+=val;
}
int query1(int poz)
{
	int rez=0;
	for (;poz>0;poz-=bit(poz))
		rez+=aib[poz];
	return rez;
}
int query2(int sum)
{
	int i,rez=0;
	for (i=1;(i<<1)<=n;i<<=1);
	for(;i;i>>=1)
	{
		if (rez+i>n)
			continue;
		if (aib[rez+i]<=sum)
		{
			sum-=aib[i+rez];
			rez+=i;
		}
	}
	if (sum==0)
		return rez;
	return -1;
}
int main()
{
	int i,x,y,z,m;
	in=fopen("aib.in","r");
	out=fopen("aib.out","w");
	fscanf(in,"%d%d",&n,&m);
	for (i=1;i<=n;i++)
	{
		fscanf(in,"%d",&x);
		update(i,x);
	}
	for (i=1;i<=m;i++)
	{
		fscanf(in,"%d",&x);
		if (x==0)
		{
			fscanf(in,"%d%d",&y,&z);
			update(y,z);
		}
		if (x==1)
		{
			fscanf(in,"%d%d",&y,&z);
			fprintf(out,"%d\n",query1(z)-query1(y-1));
		}
		if (x==2)
		{
			fscanf(in,"%d",&y);
			fprintf(out,"%d\n",query2(y));
		}

	}
	fclose(in);
	fclose(out);
	return 0;
	
}