Cod sursa(job #1791593)

Utilizator RobertSSamoilescu Robert RobertS Data 29 octombrie 2016 15:23:03
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;

int const MAX_N = 100001;
int N, M, tree[MAX_N], v[MAX_N];


void update(int index, int val) {
	index += 1;

	while (index <= N) {
		tree[index] += val;
		index += index & (-index); 
	}
}


int get_sum(int index) {
	int sum = 0;
	index += 1;


	while (index > 0) {
		sum += tree[index];
		index -= index & (-index);
	}
	
	return sum;
}

int get_index(int a, int li, int ls) {

	if (li == ls) return li;

	int lm = li + (ls - li) / 2;

	if (get_sum(lm - 1) > a) return get_index(a, li, lm - 1);
	else if (get_sum(lm - 1) < a) return get_index(a, lm + 1, ls);
	
	return lm;
}

int main() {

	ifstream fin("aib.in");
	ofstream fout("aib.out");

	
	fin >> N >> M;

	//construirea arbore
	for (int i = 0; i < N; i++) {
		fin >> v[i];
		update(i, v[i]);
	}

	for (int j = 1; j <= M; j++) {
		int type;
		fin >> type;

		if (type == 0) {
			int a, b;
			fin >> a >> b;
			update(a, b);
		} else if (type == 1) {
			int a, b;
			fin >> a >> b;

			fout << get_sum(b - 1) - get_sum(a - 2) << '\n';
		} else {
			int a;
			fin >> a;
			fout << get_index(a, 1, N) << '\n';
		}
	
	}
	


	fin.close();
	fout.close();


	return 0;
}