Cod sursa(job #179967)

Utilizator scvalexAlexandru Scvortov scvalex Data 16 aprilie 2008 15:08:54
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MIN(a, b) ((a > b) ? (b) : (a))

int N, M;
int A[100001];

void update(int pos, int val)
{
	while (pos <= N) {
		A[pos] += val;
		pos += pos & ~(pos-1);
	}
}

int query(int pos) 
{
	int S(0);

	while (pos > 0) {
		S += A[pos];
		pos -= pos & ~(pos-1);
	}

	return S;
}

int search(int val) 
{
	int step;
	for (step = 1; (step << 1) <= N; step <<= 1)
		;
	for (int i(0); step; step >>= 1)
		if ((i + step <= N) && (A[i+step] <= val)) {
			i += step;
			val -= A[i];
			if (!val)
				return i;
		}
	return -1;
}

int main(int argc, char *argv[]) 
{
	FILE *fi = fopen("aib.in", "r");
	fscanf(fi, "%d %d", &N, &M);
	int aux;
	for (int i(1); i <= N; ++i) {
		fscanf(fi, "%d", &aux);
		update(i, aux);
	}
	int op;
	int X, Y;
	FILE *fo = fopen("aib.out", "w");
	while (M--) {
		fscanf(fi, "%d", &op);
		switch (op) {
		case 0:
			fscanf(fi, "%d %d", &X, &Y);
			update(X, Y);
			break;
		case 1:
			fscanf(fi, "%d %d", &X, &Y);
			fprintf(fo, "%d\n", query(Y) - query(X-1));
			break;
		case 2:
			fscanf(fi, "%d", &X);
			fprintf(fo, "%d\n", search(X));
		}
	}
	fclose(fo);
	fclose(fi);

	return 0;
}