Cod sursa(job #2868810)

Utilizator vladsipunct5555Butnrau Vlad vladsipunct5555 Data 11 martie 2022 10:43:34
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream in ("aib.in");
ofstream out ("aib.out");
int aib[100001], n, q;
int v[100001];
void update (int poz, int val)
{
	for (int i = poz;i<=n;i += (i & -i))
		aib[i] += val;
}
int qr (int poz)
{
	int ans = 0;
	for (int i = poz;i>0;i -= (i & -i))
		ans += aib[i];
	return ans;
}
int qr2 (int val)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int poz = -1;
	int st = 1, dr = n;
	while (st <= dr)
	{
		int mid = (st + dr) / 2;
		int c = qr(mid);
		if (c ==  val)
		{
			poz = mid;
			break;
		}
		else if (c > val)
			dr = mid - 1;
		else
			st = mid + 1;
	}
	return poz;
}
main()
{
	in >> n >> q;
	for (int i = 1;i<=n;++i)
	{
		in >> v[i];
		update(i, v[i]);
	}
	for (int i = 1;i<=q;++i)
	{
		int type;
		in >> type;
		if (type == 0)
		{
			int poz, val;
			in >> poz >> val;
			update(poz, val);
		}
		else if (type == 1)
		{
			int st, dr;
			in >> st >> dr;
			out << qr(dr) - qr(st - 1) << '\n';
		}
		else 
		{
			int val;
			in >> val;
			out << qr2(val) << '\n';
		}
	}
	return 0;
}