Cod sursa(job #491717)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 12 octombrie 2010 02:42:39
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <string>

using namespace std;

#define NM 100005
#define lsb(x)(((x)^(x-1))&(x))

int AIB[NM], N, M;

int query(int pos)
{
	int ans = 0;
	
	while (pos)
	{
		ans += AIB[pos];
		pos -= lsb(pos);
	}	
	
	return ans;
}

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

int main()
{
	int a, b, op;
	
	freopen ("aib.in", "r", stdin);
	freopen ("aib.out", "w", stdout);
	
	scanf ("%d %d", &N, &M);
	
	for (int i = 1; i <= N; ++i)
	{
		scanf ("%d", &a);
		update (a, i);
	}	
	
	while (M--)
	{
		scanf ("%d", &op);
		
		if (op == 0)
		{
			scanf ("%d %d", &a, &b);
			update (b, a);
		}	
		else if (op == 1)
		{
			scanf ("%d %d", &a, &b);
			printf ("%d\n", query(b) - query(a - 1));
		}	
		else if (op == 2)
		{
			scanf ("%d", &a);
			int st = 0, dr = N;
			
			while (st < dr)
			{
				int mij = (st + dr)/2;
				
				int ansc = query(mij);
				
				if (ansc > a) dr = mij - 1;
				else if (ansc == a) dr = mij;
				else st = mij + 1;
			}	
			
			int ind = st;
			
			if (ind > N || query(ind) != a) printf ("-1\n");
			else printf ("%d\n", ind);
		}	
		
	}	
	
	return 0;
}