Cod sursa(job #1923303)

Utilizator tonisnakesBoar Antonio tonisnakes Data 10 martie 2017 22:11:36
Problema Arbori indexati binar Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;

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

int n, m, tree[NMAX], powmax;

void add (int index, int val) {
	tree[index] += val;
	index += (index & (-index));
	if (index <= n) {
		add(index,val);
	}
}

int stok (int index) {
	if (index == 0) {
		return 0;
	}
	return (tree[index] + stok(index ^ (index & (-index))));
}

int find (int a) {
	int index = 0;
	for (int k = powmax; k >= 0; --k) {
		if (tree[index + (1 << k)] <= a) {
			a -= tree[index + (1 << k)];
			index += (1 << k);
			if (!a) {
				return index;
			}
		}
	}
	return -1;
}

int main ()
{
	fin >> n >> m;
	powmax = 0;
	while ((1 << powmax) <= n) {
		++powmax;
	}
	--powmax;
	//cout << (1 << powmax);
	int p, x, y;
	for (int i = 1; i <= n; ++i) {
		fin >> x;
		add(i,x);
	}
	for (int i = 1; i <= m; ++i) {
		fin >> p;
		if (p == 0) {
			fin >> x >> y;
			add(x,y);
		}
		else
		if (p == 1) {
			fin >> x >> y;
			fout << stok(y) - stok(x-1) << '\n';
		}
		else {
			fin >> x;
			fout << find(x) << '\n';
		}
	}
	/*for (int i = 1; i <= n; ++i) {
		cout << tree[i] << " ";
	}*/
	
	fin.close();
	fout.close();
	return 0;
}