Cod sursa(job #3323366)

Utilizator AndreiRaresAcatrini Rares Andrei AndreiRares Data 18 noiembrie 2025 10:11:08
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>
using namespace std;

#define int long long

#ifdef LOCAL
#define fin cin
#define fout cout
#else
ifstream fin("aib.in");
ofstream fout("aib.out");
#endif

int n, suma=0;
int aib[100001];

void update(int p, int a) {
	suma += a;
	while (p <= n) {
		aib[p] += a;
		p += (p & -p);
	}
}

int query(int p) {
	int s = 0;
	while (p > 0) {
		s += aib[p];
		p -= (p & -p);
	}
	return s;
}

int search(int a) {
	if (a > suma) return -1;
	int pas=1, urm;
	int k=0;
	while (2 * pas < n) pas *= 2;
	while (pas) {
		urm = k + pas;
		if (urm < n && aib[urm] < a) {
			a -= aib[urm];
			k = urm;
		}
		pas /= 2;
	}
	return k + 1;
}

int32_t main() {
	int m, t, a, b;
	fin >> n >> m;
	for (int i=1; i<=n; i++) {
		fin >> a;
		update(i, a);
	}
	for (int i=1; i<=m; i++) {
		fin >> t >> a;
		if (t == 0) {
			fin >> b;
			update(a, b);
		}
		else if (t == 1) {
			fin >> b;
			fout << query(b) - query(a - 1) << '\n';
		}
		else fout << search(a) << '\n';
	}
}