Cod sursa(job #1362595)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 26 februarie 2015 13:52:29
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#define NMAX 100023
FILE *fin, *fout;
int aib[NMAX], x, y, z, n, m, temp;
void update(int pos, int val)
{
	while(pos <= n)
	{
		aib[pos]+=val;
		pos+= pos & (pos ^ (pos-1));
	}
}
int query(int pos)
{
	int sol = 0;
	while(pos)
	{
		sol += aib[pos];
		pos -= pos & (pos ^ (pos-1));
	}
	return sol;
}
int query2(int Sum)
{
    int w = 1;
    while(w < n) w <<= 1;
    for(int i = 0; w; w >>= 1)
        if(i + w <= n)
            if(Sum >= aib[i + w])
            {
                i += w;
                Sum -= aib[i];
                if(! Sum) return i;
            }
    return -1;
}
int main()
{
	fin = freopen("aib.in", "r", stdin);
	fout= freopen("aib.out", "w", stdout);
	scanf("%d %d", &n, &m);
	for(int i = 1; i<= n; i++)
	{
		scanf("%d", &temp);
		update(i, temp);
	}
	for(int i = 0; i< m; i++)
	{
		scanf("%d", &x);
		if(x == 0)
		{
			scanf("%d%d", &y, &z);
			update(y, z);
		}
		if(x == 1)
		{
			scanf("%d%d", &y, &z);
			printf("%d\n", query(z) - query(y-1));
		}
		if(x == 2)
		{
			scanf("%d", &y);
			printf("%d\n", query2(y));
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}