Cod sursa(job #2900528)

Utilizator mateicalin2002Ceausu Matei Calin mateicalin2002 Data 11 mai 2022 01:18:30
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 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);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		int x;
		scanf("%d", &x);
		update(i, x);
	}
	for (int i = 1; i <= m; i++) {
		int q;
		scanf("%d", &q);
		if (q == 0) {
			int poz, x;
			scanf("%d%d", &poz, &x);
			update(poz, x);
		} else 
			if (q == 1) {
				int a, b;
				scanf("%d%d", &a, &b);
				cout << query(b) - query(a - 1) << '\n';
			} else {
				int x;
				scanf("%d", &x);
				int k = binary_search(x);
				if (query(k) == x)
					printf("%d\n", k);
				else
					printf("-1\n");
			}
	}
	return 0;
}