Cod sursa(job #2292287)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 29 noiembrie 2018 12:17:37
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

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

const int DIM = 1e5 + 17;

int aib[DIM];
int n;

void update(int pos, int val)
{
	for(int i = pos; i <= n; i += i & (-i))
		aib[i] += val;

}

int get_sum(int pos)
{
	int s = 0;

	for(int i = pos; i >= 1; i -= i & (-i))
		s += aib[i];
	return s;
}

int main()
{
	int m;
	in >> n >> m;

	for(int i = 1; i <= n; i++)
	{
		int x;
		in >> x;

		update(i, x);
	}

	while(m--)
	{
		int op;
		in >> op;

		if(op == 0)
		{
			int pos, val;
			in >> pos >> val;
			update(pos, val);
		}
		else
			if(op == 1)
			{
				int l, r;
				in >> l >> r;

				out << get_sum(r) - get_sum(l - 1) << '\n';
			}
			else
			{
				int sum;
				in >> sum;

				int l = 1;
				int r = n;

				int pos = -1;

				while(l <= r)
				{
					int mid = (l + r) / 2;

					int p = get_sum(mid);

					if(p >= sum)
					{
						if(p == sum)
							pos = mid;
						r = mid - 1;
					}
					else
					{
						l = mid + 1;
					}
				}

				out << pos << '\n';
			}
	}
}