Cod sursa(job #173426)

Utilizator ProtomanAndrei Purice Protoman Data 7 aprilie 2008 19:23:41
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>
#define mx 150010
long n,m,rez,s;
long ai[4*mx+4];

void add(long nod, long p, long u, long poz, long x)
{
	if (p==u && p==poz)
	{
		ai[nod]+=x;
		return;
	}
	if (p<u)
	{
		long m=(p+u)/2;
		if (poz<=m)
			add(nod*2,p,m,poz,x);
		if (m<poz)
			add(nod*2+1,m+1,u,poz,x);
		ai[nod]=ai[2*nod]+ai[2*nod+1];
	}
}

long querysint(long nod, long p, long u, long a, long b)
{
	if (a<=p && b>=u)
		return ai[nod];
	if (p<u)
	{
		long m=(p+u)/2,s=0;
		if (a<=m)
			s+=querysint(nod*2,p,m,a,b);
		if (b>m)
			s+=querysint(nod*2+1,m+1,u,a,b);
		return s;
	}
}

void querysm(long nod, long p, long u)
{
	if (p==u && s==ai[nod])
	{
		rez=p;
		return;
	}
	if (ai[nod]<s)
	{
		s-=ai[nod];
		return;
	}
	if (p<u)
	{
		long m=(p+u)/2;
		querysm(2*nod,p,m);
		if (rez==0)
			querysm(2*nod+1,m+1,u);
	}
}

int main()
{
	freopen("aib.in","r",stdin);
	freopen("aib.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	for (int i=1; i<=n; i++)
	{
		long x;
		scanf("%ld",&x);
		add(1,1,n,i,x);
	}
	for (int i=1; i<=m; i++)
	{
		long caz,x,y;
		scanf("%ld",&caz);
		if (caz<2)
			scanf("%ld %ld",&x,&y);
		else scanf("%ld",&s);
		if (caz==2)
		{
			rez=0;
			querysm(1,1,n);
			printf("%ld\n",rez);
		}
		else if (caz==1)
				printf("%ld\n",querysint(1,1,n,x,y));
			else add(1,1,n,x,y);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}