Cod sursa(job #2213716)

Utilizator ArkinyStoica Alex Arkiny Data 16 iunie 2018 23:45:58
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<unordered_map>
#include<algorithm>
#include<string.h>
using namespace std;

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

int AIB[200010];
int N;
void update(int x, int val)
{
	for(;x<=N;x+=x&(-x))
		AIB[x]+=val;
}

int query(int x)
{
	int sum = 0;

	for (; x; x -= x & (-x))
		sum += AIB[x];

	return sum;
}

int caut_bin(int s)
{
	int l = 1, r = N;

	while (l <= r)
	{
		int mid = (l + r) >> 1;

		int q = query(mid);

		if (q > s)
			r = mid - 1;
		else
			l = mid + 1;


	}

	if (l > r)
		return -1;
	else
		return r;

}

int main()
{
	int N, Q;

	in >> N;

	for (int i = 1; i <= N; ++i)
	{
		int val;
		in >> val;

		update(i, val);
	}


	for (int i = 1; i <= Q; ++i)
	{
		int op;

		in >> op;

		if (op == 0)
		{
			int x, y;

			in >> x >> y;

			update(x, y);
		}
		else if (op == 1)
		{
			int x, y;

			in >> x >> y;

			out << query(y) - query(x - 1) << "\n";
		}
		else
		{
			int k;

			in >> k;

			out << caut_bin(k) << "\n";
		}

	}

	return 0;
}