Cod sursa(job #632552)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 11 noiembrie 2011 16:29:57
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#define lsb(x) x & -x

int aib [100005], N, M;

void update (int x, int val)
{
	while (x <= N)
	{
		aib[x] += val;
		x += lsb(x);
	}
}

int query (int x)
{
	int r = 0;
	while (x > 0)
	{
		r += aib[x];
		x -= lsb(x);
	}
	return r;
}

int cauta (int val)
{
	int p = 1, u = N, m, s;
	while (p <= u)
	{
		m = (p+u) >> 1;
		s = query (m);
		if (s == val)
			return m;
		if (s < val)
			p = m + 1;
		else
			u = m - 1;
	}
	return -1;
}

void parc ()
{
	scanf ("%d%d", &N, &M);
	for (int i = 1, x; i <= N; i++)
	{
		scanf ("%d", &x);
		update (i, x);
	}
	for (int i = 1, t, a, b; i <= M; i++)
	{
		scanf ("%d%d", &t, &a);
		if (t == 2)
		{
			printf ("%d\n", cauta (a));
		} 
		else
		{
			scanf ("%d", &b);
			if (t)
				printf ("%d\n", query (b) - query (a-1));
			else
				update (a, b);
		}
	}
}

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