Cod sursa(job #185092)

Utilizator Spike7d8Cristian Varvara Spike7d8 Data 24 aprilie 2008 19:10:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>

#define next(i) ((i) & (-i))
#define N 100352

int a[N], n;


void update(int p, int v)
{
	for (; p <= n; p += next(p))
		a[p] += v;
}


int query(int p)
{
	int s = 0;

	for (; p; p  -= next(p))
		s += a[p];

	return s;
}


int search(int v)
{
	int i, t, step = 1;
	while (step <= n) step <<= 1;

	for (i = 0; step; step >>= 1)
		if (i + step <= n)
		{
			t = query(i + step);
			if (t == v)
				return i + step;
			if (t < v)
				i += step;
		}

	return -1;
}


int main()
{
	freopen("aib.in", "rt", stdin);
	freopen("aib.out", "wt", stdout);

	int m;
	scanf("%d%d", &n, &m);
	for (int v, i = 1; i <= n; i++)
	{
		scanf("%d", &v);
		update(i, v);
	}

	for (int t, i = 0; i < m; i++)
	{
		scanf("%d", &t);
		if (t == 0)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			update(x, y);
		}
		else if (t == 1)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			printf("%d\n", query(y) - query(x - 1));
		}
		else
		{
			int x;
			scanf("%d", &x);
			printf("%d\n", search(x));
		}
	}

	return 0;
}