Cod sursa(job #3149303)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 7 septembrie 2023 10:56:51
Problema Arbori indexati binar Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std; 
#define lung(x) ( (x ^(x - 1)) & x )

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

int N, M, aib[100100]; 

void update(int poz, int val) {
	for (int i = poz; i <= N + 1; i += lung(i))
		aib[i] += val; 
} 

int query(int poz) {
	int s = 0; 
	for (int i = poz; i >= 1; i -= lung(i))
		s += aib[i]; 

	return s; 
}

int search(int a) {
	int st = 1, dr = N, mid, sol = -1; 

	while (st <= dr) {
		mid = (st + dr) / 2;

		if (query(mid) == a) {
			sol = mid;
			dr = mid - 1;
		}
		else if (query(mid) < a)
			st = mid + 1;
		else
			dr = mid - 1; 
	}

	return sol; 
}

int main() {
	cin >> N >> M;

	//citire elemente
	for (int i = 1; i <= N; i++) {
		int x; 
		cin >> x; 
		update(i, x); 
	}
	
	int a, b, x; 
	for (int i = 1; i <= M; i++) {
		cin >> x;

		if (x != 2) {
			cin >> a >> b;

			if (x == 0)
				update(a, b);
			else if (x == 1)
				cout << query(b) - query(a) - 1 << '\n';
		}
		else {
			cin >> a; 
			cout << search(a) << '\n';
		}
	}

	return 0;
}