Cod sursa(job #3149298)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 7 septembrie 2023 10:37:55
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <iostream>
using namespace std;

int lung(int x) {
	return ( ( x ^ (x - 1) ) & x)
}

int N, M; 
int aib[100100]; 

void update (int poz, int val) {
	for (int i = poz; i <= N; 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 mid, st = 1, dr = N, sol = -1; 
	while (st <= dr) {
		mid = (st + dr) / 2; 
		
		if (query(mid) == a) {
			sol = mid;
			dr = mid - 1;
		}

		else if (query(mid) > a)
			dr = mid - 1;

		else
			st = mid + 1; 
	}

	return sol; 
}

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

	int x; 
	for (int i = 1; i <= N; i++) {
		cin >> x; 
		update(i, x); 
	}

	int q, a, b;  
	for (int i = 1; i <= M; i++) {
		cin >> q; 
		if (q == 1) {
			cin >> a >> b; 
			update(a, b); 
		}

		if (q == 2) {
			cin >> a >> b; 
			cout << query(b) - query(a) - 1 << '\n'; 
		}

		if (q == 3) {
			cin >> a; 
			cout << search(a) << '\n'; 
		}
	}

	return 0; 
}