Cod sursa(job #252549)

Utilizator raduzerRadu Zernoveanu raduzer Data 4 februarie 2009 16:24:35
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>

const int MAX_N = 100010;

int n, m;
int aib[MAX_N];

void update(int poz, int val)
{
	while (poz <= n)
	{
		aib[poz] += val;
		poz += poz & -poz;
	}
}

int query(int poz)
{
	int sum = 0;
	
	while (poz)
	{
		sum += aib[poz];
		poz &= poz - 1;
	}
	
	return sum;
}

int find(int x)
{
	int pow = 1, i;
	while ((pow << 1) <= n) pow <<= 1;
		
	for (i = 0; pow; pow >>= 1)
        if (i + pow <= n && aib[i + pow] <= x) 
		{			
            x -= aib[i + pow];  
            i += pow;  
        }  
	
	if (!x) return i;
	return -1;
}

int main()
{
	int i, x, y, z;
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	
	scanf("%d %d", &n, &m);
	
	for (i = 1; i <= n; ++i) 
	{
		scanf("%d", &x);
		aib[i] += x;
		if (i + (i & -i) <= n) 
			aib[i + (i & -i)] += aib[i];
	}
	
	for (i = 1; i <= m; ++i)
	{
		scanf("%d %d", &x, &y);
		
		if (x == 0) 
		{
			scanf("%d", &z);
			update(y, z);
		}
		
		if (x == 1)
		{
			scanf("%d", &z);
			printf("%d\n", query(z) - query(y - 1));
		}
		
		if (x == 2)
			printf("%d\n", find(y));
	}
}