Cod sursa(job #2857686)

Utilizator LXGALXGA a LXGA Data 26 februarie 2022 09:09:38
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;
ifstream cin("aib.in");
ofstream cout("aib.out");
int n, m;
class ftree
{
private:
	int v[1000001];
	int n;
	int sum(int r)
	{
		int s = 0;
		for (; r > 0; r -= (r & (-r)))
			s += v[r];
		return s;
	}
public:
	void init(int* x, int n)
	{
		this->n = n;
		for (int i = 1; i <= n; i++)
			add(i, x[i]);
	}
	void add(int pos, int val)
	{
		for (; pos <= n; pos += (pos & (-pos)))
			v[pos] += val;
	}
	int sum(int l, int r)
	{
		return sum(r) - sum(l - 1);
	}
	int search(int val)
	{
		int l = 1, r = n + 1;
		while (r - l > 1)
		{
			int mid = (l + r) / 2;
			if (sum(mid) <= val)
				l = mid;
			else r = mid;
		}
		return l;
	}
};
ftree aib;

int v[1000001];
int main()
{
	ios_base::sync_with_stdio(false);
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> v[i];
	aib.init(v, n);
	char c;
	int a, b;
	for (int i = 1; i <= m; i++)
	{
		cin >> c;
		if (c == '0')
		{
			cin >> a >> b;
			aib.add(a, b);
		}
		if (c == '1')
		{
			cin >> a >> b;
			cout << aib.sum(a, b) << '\n';
		}
		if (c == '2')
		{
			cin >> a;
			cout << aib.search(a) << '\n';
		}
	}
	return 0;
}