Cod sursa(job #173545)

Utilizator ProtomanAndrei Purice Protoman Data 7 aprilie 2008 20:29:39
Problema Arbori indexati binar Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
#define mx 62010
long n,m,rez,s,maxnod=0,a,b,caz;
long ai[4*mx+4];

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

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

void querysm(long nod, long p, long u)
{
	if (p==u && s==ai[nod])
	{
		rez=p;
		s=0;
		return;
	}
	if (ai[nod]<s || p==u)
	{
		s-=ai[nod];
		return;
	}
	if (p<u)
	{
		long m=(p+u)/2;
		querysm(2*nod,p,m);
		if (rez==0 && s>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++)
	{
		scanf("%ld",&b);
		add(1,1,n,i);
	}
	for (int i=1; i<=m; i++)
	{
		scanf("%ld",&caz);
		if (caz<2)
			scanf("%ld %ld",&a,&b);
		else scanf("%ld",&s);
		if (caz)
			rez=0;
		if (caz==2)
		{
			querysm(1,1,n);
			if (rez)
				printf("%ld\n",rez);
			else printf("-1\n");
		}
		else if (caz==1)
			{
				querysint(1,1,n);
				printf("%ld\n",rez);
			}
			else add(1,1,n,a);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}