Cod sursa(job #759334)

Utilizator geniucosOncescu Costin geniucos Data 17 iunie 2012 16:48:57
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<cstdio>
using namespace std;
int i,tip,st,dr,ai,n,m1,p,v,v1,u,m,aib[100004];
void update(int p,int v)
{
	while(p<=n)
	{
		aib[p]+=v;
		p=p+(p-(p&(p-1)));
	}
}
int query(int p)
{
	int s=0;
	while(p>0)
	{
		s=s+aib[p];
		p=p-(p-(p&(p-1)));
	}
	return s;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m1);
for(i=1;i<=n;i++)
{
	scanf("%d",&ai);
	update(i,ai);
}
for(i=1;i<=m1;i++)
{
	scanf("%d",&tip);
	if(tip==0)
	{
		scanf("%d",&p);
		scanf("%d",&v);
		update(p,v);
	}
	else
	if(tip==1)
	{
		scanf("%d",&st);
		scanf("%d",&dr);
		printf("%d\n",query(dr)-query(st-1));
	}
	else
	{
		scanf("%d",&v1);
		p=1;
		u=n;
		while(p<=u)
		{
			m=(p+u)/2;
			v=query(m);
			if(v>v1) u=m-1;
			else
			if(v<v1) p=m+1;
			else break;
		}
		printf("%d\n",m);
	}
}
return 0;
}