Cod sursa(job #330280)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 9 iulie 2009 13:23:51
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
int n,m;
int v[100005];

void update(int p, int x)
{
	while(p<=n)
	{
		v[p]+=x;
		p=p+((p&(p-1))^p);
	}
}

int query(int p)
{
	int s=0;
	while(p)
	{
		s=s+v[p];
		p=p-((p&(p-1))^p);
	}
	return s;
}

int cautare(int s)
{
	int st=1,dr=n,mij,x;
	while(st<=dr)
	{
		mij=(st+dr)>>1;
		x=query(mij);
		if(x==s)
			return mij;
		if(x<s)
			st=mij+1;
		else
			dr=mij-1;
	}
	return -1;
}

void read()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,a,b,x;
	for(i=1;i<=n;i++)
		scanf("%d",&a),update(i,a);
	for(i=1;i<=m;i++)
	{
		scanf("%d",&x);
		if(x==0)
			scanf("%d%d",&a,&b),update(a,b);
		if(x==1)
			scanf("%d%d",&a,&b),printf("%d\n",query(b)-query(a-1));
		if(x==2)
			scanf("%d",&a),printf("%d\n",cautare(a));
	}
}

int main()
{
	read();
	return 0;
}