Cod sursa(job #222524)

Utilizator alex.cepoiAlexandru Cepoi alex.cepoi Data 23 noiembrie 2008 02:27:50
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

int A[200000];
int N, M, logN=1;

inline int LST (int x) {return x & (-x);}

void update (int x, int y)
{
	for (int i=x; i<=N; i+= LST(i))
		A[i]+= y;
}

int query (int x)
{
	int S=0;
	for (int i=x; i>0; i-= LST(i))
		S+=A[i];

	return S;
}


int query2 (int S)
{
	if (!S) return -1;
	
	int i=0;
	for (int step=logN; step; step>>=1)
		if (i+step<=N && A[i+step]<=S)
		{
			i+=step;
			S-=A[i];
		}

	if (!S)	return i;
	else return -1;
}

int main()
{
	freopen ("aib.in", "r", stdin);
	freopen ("aib.out", "w", stdout);

	int c, x, y;

	scanf ("%d%d", &N, &M);
	for (int i=1; i<=N; ++i)
	{
		scanf ("%d", &c);
		update (i,c);
	}

	while (logN<=N/2)logN<<=1;

	while (M--)
	{
		scanf ("%d", &c);
		if (c==2)
		{
			scanf ("%d", &x);
			printf ("%d\n", query2 (x));
		}
		else
		{
			scanf ("%d %d", &x, &y);
			if (!c) update (x,y);
			else printf ("%d\n", (query (y)-query (x-1)));
		}
	}

	return 0;
}