Cod sursa(job #1923324)

Utilizator tonisnakesBoar Antonio tonisnakes Data 10 martie 2017 22:36:48
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 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 stok (int index) {
	int sum = 0;
	for (int i = index; i > 0; i -= (i & (-i)) ) {
		sum += tree[i];
	}
	return sum;
}

/*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 find (int a) {
	int step;
	for (step = 1; step < n; step <<= 1);
	for (int i = 0; step; step >>= 1) {
		if (i + step <= n && a >= tree[i + step]) {
			i += step;
			a -= tree[i];
			if (!a) {
				return i;
			}
		}
	}
	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;
}