Cod sursa(job #2865740)

Utilizator alextmAlexandru Toma alextm Data 9 martie 2022 10:00:18
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 1;

int n, m, v[MAXN], aib[MAXN];

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

int query(int pos) {
	int ans = 0;
	for(int i = pos; i > 0; i -= i & -i)
		ans += aib[i];
	return ans;
}

int findPosition(int x) {
	int st = 1, dr = n;
	while(st <= dr) {
		int mid = (st + dr) / 2;
		int q = query(mid);
		if(q == x) 
			return mid;
		if(q > x)
			dr = mid - 1;
		else
			st = mid + 1;
	}
	return pos;
}

int main() {
	ifstream cin("aib.in");
	ofstream cout("aib.out");
	
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		cin >> v[i];
		update(i, v[i]);
	}
	
	while(m--) {
		int op, x, y;
		cin >> op >> x;
		if(op == 0) {
			cin >> y;
			update(x, y);
		}
		else if(op == 1) {
			cin >> y;
			cout << query(y) - query(x - 1) << '\n';
		}
		else
			cout << findPosition(x) << '\n';
	}
	
	return 0;
}