Cod sursa(job #179938)

Utilizator scvalexAlexandru Scvortov scvalex Data 16 aprilie 2008 14:44:15
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 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 step;

	for (step = 1; step < N; step <<= 1)
		;

	for (int i(0); step; step >>= 1) {
		if (i + step <= N) {
			if (val >= A[i+step]) {
				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;
	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);
			printf("%d\n", query(Y) - query(X-1));
			break;
		case 2:
			fscanf(fi, "%d", &X);
			printf("%d\n", search(X));
		}
	}
	fclose(fi);

	return 0;
}