Cod sursa(job #2900526)

Utilizator mateicalin2002Ceausu Matei Calin mateicalin2002 Data 11 mai 2022 01:15:25
Problema Arbori indexati binar Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 5;

int n, m, aib[NMAX];

void update(int poz, int x)
{
	while (poz <= n) {
		aib[poz] += x;
		poz += poz & (-poz);
	}
}
int query(int poz)
{
	int ans = 0;
	while (poz > 0) {
		ans += aib[poz];
		poz -= poz & (-poz);
	}
	return ans;
}
int binary_search(int x)
{
	int st = 1, dr = n;
	while (st <= dr) {
		int mij = (st + dr) / 2;
		if (query(mij) < x)
			st = mij + 1;
		else
			dr = mij - 1;
	}
	return st;
}
int main()
{
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		update(i, x);
	}
	for (int i = 1; i <= m; i++) {
		int q;
		cin >> q;
		if (q == 0) {
			int poz, x;
			cin >> poz >> x;
			update(poz, x);
		} else 
			if (q == 1) {
				int a, b;
				cin >> a >> b;
				cout << query(b) - query(a - 1) << '\n';
			} else {
				int x;
				cin >> x;
				int k = binary_search(x);
				if (query(k) == x)
					cout << k << '\n';
				else
					cout << -1 << '\n';
			}
	}
	return 0;
}