Cod sursa(job #2982621)

Utilizator CosminChCosmin Chiron CosminCh Data 20 februarie 2023 16:16:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
using namespace std;

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

int n, q, a[100010];

void upd(int p, int val)
{
	for (int i = p; i <= n; i += i & (-i))
		a[i] += val;
}
int sum(int poz)
{
	int val = 0;
	for (int i = poz; i > 0; i -= i & (-i))
		val += a[i];
	return val;
}

int main()
{
	in >> n >> q;
	for (int i = 1; i <= n; i++)
	{
		int x;
		in >> x;
		upd(i,x);
	}
	for (int i = 1; i <= q; i++)
	{
		int tip;
		in >> tip;

		if (tip == 0)
		{
			int poz,val;
			in >> poz >> val;
			upd(poz, val);
		}

		if (tip == 1)
		{
			int st,dr;
			in >> st>>dr;
			out<<sum(dr)-sum(st-1)<<'\n';
		}

		if (tip == 2)
		{
			int s;
			in>>s;
			int lo = 0, hi = n,mi;
			while (hi - lo > 1)
			{
				mi = (lo + hi) / 2;
				if (sum(mi) < s)
					lo = mi;
				else
					hi = mi;
			}
			if (sum(hi) == s)
				out << hi << '\n';
			else
				out << "-1\n";
		}
	}
	return 0;
}