Cod sursa(job #1658454)

Utilizator moscugeorgeMoscu George moscugeorge Data 21 martie 2016 15:32:52
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <iostream>
#include <math.h>
#include <fstream>

#define zeros(x) (x & (~(x-1)))

int aib[100000];
int v[100000];
int n;

using namespace std;

void init_aib(){
	for (int i = 1; i <= n; i++){
		for (int j = (i - zeros(i)) + 1; j <= i; j++){
			//if (j <= 0) j = 1;
			aib[i] += v[j];
		}
	}
}

void update(int x, int val){
	for (int i = x; i <= n; i+=zeros(i)){
		aib[i] += val;
	}
}

int querry(int x){
	int sum = 0;
	for (int i = x; i>0; i -= zeros(i)){
		sum += aib[i];
	}
	return sum;
}

int return_val(int a){
	for (int i = 1; i <= n; i++){
		if (a == aib[i]) return i;
	}
	return -1;
}

using namespace std;

int main()
{
	ifstream f("aib.in");
	ofstream g("aib.out");

	
	int m;
	f >> n >> m;
	for (int i = 1; i <= n; i++){
		f >> v[i];
	}

	init_aib();
	for (int i = 0; i<m; i++){
		int a, b, c;
		f >> c;
		switch (c){
		case 0:
			f >> a >> b;
			update(a, b);
			break;
		case 1:
			f >> a >> b;
			g << querry(b) - querry(a - 1) << endl;
			break;
		case 2:
			f >> a;
			g << return_val(a) << endl;
			break;
		}
	}
	f.close();
	return 0;
}