Cod sursa(job #179957)

Utilizator scvalexAlexandru Scvortov scvalex Data 16 aprilie 2008 15:00:26
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 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))&pos;
	}
}

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

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

	return S;
}

int search(int val) 
{
	int p = 1,
	    r = N;

	int q,
	    qval;
	while (p < r) {
		q = p + (r - p) / 2;
		qval = query(q);
		if (qval < val)
			p = q + 1;
		else
			r = q;
	}

	if (A[p] == val)
		return p;
	else
		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;
}