Cod sursa(job #174364)

Utilizator anoukAnca Dumitrache anouk Data 8 aprilie 2008 20:06:10
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#define DIM 100020
using namespace std;

int N, M, K, X, Y, A[DIM];

int bit(int x);
void Update (int P, int V);
int Query(int P);
int BinSearch(int V);

int main()
{
	FILE *fin = fopen("aib.in", "r");
	FILE *fout = fopen("aib.out", "w");

	fscanf(fin, "%d%d", &N, &M);
	for (int i = 1; i <= N; i++)
	{
		fscanf(fin, "%d", &X);
		Update(i, X);
	}
	for (int i = 1; i <= M; i++)
	{
		fscanf(fin, "%d", &K);
		if (K == 0)
		{
			fscanf(fin, "%d%d", &X, &Y);
			Update(X, Y);
		}
		if (K == 1)
		{
			fscanf(fin, "%d%d", &X, &Y);
			fprintf(fout, "%d\n", Query(Y) - Query(X - 1));
		}
		if (K == 2)
		{
			fscanf(fin, "%d", &X);
			fprintf(fout, "%d\n", BinSearch(X));
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}

int bit (int x)
{
	return (x & (x - 1)) ^ x;
}

void Update(int P, int V)
{
	for (int i = P; i <= N; i += bit(i))
		A[i] += V;
}

int Query(int P)
{
	int sol = 0;
	for (int i = P; i > 0; i -= bit(i))
		sol += A[i];
	return sol;
}

int BinSearch(int V)
{
	int st = 1, dr = N, p = DIM; 
	while (st <= dr)
	{
		int pivot = (st + dr) / 2, sum = Query(pivot);
		if (sum == V)
		{
			p = p < pivot ? p : pivot;
			dr = pivot - 1;
		}
		else if (sum > V)
			dr = pivot - 1;
		else
			st = pivot + 1;
	}
	return p == DIM ? -1 : p;
}