Cod sursa(job #3345854)

Utilizator CreditKing69Bogdan Moldovan CreditKing69 Data 11 martie 2026 14:25:25
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n, m;
vector<int> v, aib;

int zeros(int x) {
	return x&-x;
}

void update(int pos, int val) {
	for (int i = pos; i <= n; i += zeros(i))
		aib[i] += val;
}

void create() {
	for (int i = 1; i <= n; i++) {
		for(int j = i; j <= n; j += zeros(j))
			aib[j] += v[i];
	}
}

int suma(int x){
	int sum = 0;
	for (int i = x; i > 0; i -= zeros(i))
		sum += aib[i];
	return sum;
}

int binarySearch(int x) {
	int st = 1, dr = n;
	while (st <= dr)
	{
		int mij = (st + dr) / 2;
		int val = suma(mij);
		if (val > x)
			dr = mij - 1;
		else if (val < x)
			st = mij + 1;
		else
			return mij;
	}
	return -1;
}

int main()
{
	in >> n >> m;
	v.resize(n + 1);
	aib.resize(n + 1); //resize la vectorul arborelor indexate binar
	for(int i=1; i<=n; i++)
		in >> v[i];
	create();
	int q, x, y;
	while (m--) {
		in >> q;
		if (q == 0) {
			in >> x >> y;
			update(x, y);
		}
		if (q == 1) { // sumator pentru intervalul [x, y]
			int sum = 0;
			in >> x >> y;
			sum += suma(y) - suma(x - 1);
			out << sum << "\n";
		}
		if (q == 2) { // Sa se determine pozitia minima k astfel incat suma valorilor primilor k termeni sa fie exact x.
			in >> x;
			out<<binarySearch(x)<<'\n';
		}
	}
}