Cod sursa(job #286347)

Utilizator cotofanaCotofana Cristian cotofana Data 23 martie 2009 18:25:28
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <stdio.h>
#define dim 100100

int n, m, aib[dim];

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

void update(int i, int val)
{
	for (; i<=n; i+=lsb(i))
		aib[i]+=val;
}

int sum(int i)
{
	int sum=0;
	for (; i; i-=lsb(i))
		sum+=aib[i];
	return sum;
}

int query(int a, int b)
{
	return sum(b)-sum(a-1);
}

int search(int val)
{
	int i, poz;
	for (poz=1; poz<=n; poz<<=1);
	for (i=0; poz; poz>>=1)
		if (i+poz<=n && val>=aib[i+poz])
		{
			i+=poz;
			val-=aib[i];
			if (!val) return i;
		}
		return -1;
}

int main()
{
	int i, op, a, b;
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=n; i++)
	{
		scanf("%d ", &a);
		update(i, a);
	}
	for (i=1; i<=m; i++)
	{
		scanf("%d ", &op);
		if (op<2)
		{
			scanf("%d %d\n", &a, &b);
			if (!op) update(a, b);
			else printf("%d\n", query(a, b));
		}
		else
		{ 
			scanf("%d\n", &a);
			printf("%d\n", search(a));
		}
	}
	return 0;
}