Cod sursa(job #2812770)

Utilizator lucamLuca Mazilescu lucam Data 5 decembrie 2021 01:32:29
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

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

inline int lsb(int x) {
	return x & (-x);
}

inline int log2(int x) {
	return 31 - __builtin_clz(x);
}

const int N = 1e5;

int n;
struct Fwt {
	int v[N + 1];
	void update(int i, int d) {
		++i;
		for (; i <= n; i += lsb(i)) {
			v[i] += d;
		}
	}
	int query_prefix(int i) {
		++i;
		int q = 0;
		for (; i != 0; i -= lsb(i)) {
			q += v[i];
		}
		return q;
	}
	int query_range(int l, int r) {
		return query_prefix(r) - query_prefix(l - 1);
	}
	int query_k_sum(int k) {
		int p2 = 1 << log2(n);
		int i = 0;
		while (p2 != 0 && k != 0) {
			if (i + p2 <= n && v[i + p2] <= k) {
				k -= v[i + p2];
				i += p2;
			}
			p2 /= 2;
		}
		return (k == 0 && i != 0) ? i : -1;
	}
} fwt;

int main() {
	int q;
	in >> n >> q;
	for (int i = 0; i < n; ++i) {
		int x;
		in >> x;
		fwt.update(i, x);
	}
	for (int i = 0; i < q; ++i) {
		int query;
		in >> query;
		switch (query) {
		case 0: {
			int i, x;
			in >> i >> x;
			--i;
			fwt.update(i, x);
			break;
		}
		case 1: {
			int i, j;
			in >> i >> j;
			--i, --j;
			out << fwt.query_range(i, j) << '\n';
			break;
		}
		case 2: {
			int k;
			in >> k;
			out << fwt.query_k_sum(k) << '\n';
			break;
		}
		}
	}
}