Cod sursa(job #2273600)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 31 octombrie 2018 19:46:07
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N = 100000 + 5;
int n, q;
int aib[N];

inline void add(int poz, int x) {
	for (int i = poz; i <= n; i += i & (-i)) {
		aib[i] += x;
	}
}

inline int prefix(int poz) {
	int ans = 0;
	for (int i = poz; i >= 1; i -= i & (-i)) {
		ans += aib[i];
	}
	return ans;
}

int main() {
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	cin >> n >> q;
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> x;
		add(i, x);
	}
	while (q--) {
		int type;
		cin >> type;
		if (type == 0) {
			int a, b;
			cin >> a >> b;
			add(a, b);
		}
		if (type == 1) {
			int a, b;
			cin >> a >> b;
			cout << prefix(b) - prefix(a - 1) << "\n";
		}
		if (type == 2) {
			int x;
			cin >> x;
			int cur = 0;
			int r = 0, pas = (1 << 17);
			while (pas) {
				if (r + pas <= n && cur + aib[r + pas] < x) {
					r += pas;
				}
				pas /= 2;
			}
			r++;
			if (1 <= r && r <= n && prefix(r) == x) {
				cout << r << "\n";
			}
			else {
				cout << "-1\n";
			}
		}
	}
}