Cod sursa(job #222521)

Utilizator alex.cepoiAlexandru Cepoi alex.cepoi Data 23 noiembrie 2008 01:23:34
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <vector>
using namespace std;

int A[200000];
int N, M;

inline int LST (int x) {return x & (-x);}
inline int MST (int x)
{
	int nr=0;
	while (x>>1)
	{
		x>>=1;
		nr++;
	}
	return 1<<nr;
}

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, int start, int stop)
{
	if (S==0) return start;
	if (start>=stop) return -1;

	int x=MST (stop-start);

	if (A[start+x]>S)
		return query2 (S, start, start+x-1);
	else
		return query2 (S-A[start+x], start+x, stop);
}


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);
	}

	for (int i=0; i<M; ++i)
	{
		scanf ("%d", &c);
		if (c==2)
		{
			scanf ("%d", &x);
			if (!x) printf ("-1\n");
			else printf ("%d\n", query2 (x, 0, N));
		}
		else
		{
			scanf ("%d %d", &x, &y);
			if (!c) update (x,y);
			else printf ("%d\n", (query (y)-query (x-1)));
		}
	}

	return 0;
}