Cod sursa(job #2754642)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 26 mai 2021 10:51:35
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, a[100005], aib[100005];

void update(int p, int x) {
	for( ; p <= n; p += (p&(-p)))
		aib[p] += x;
}

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

int bs(int x) {
	int l = 0, r = n, ans = -1;
	while(l <= r) {
		int m = l+(r-l)/2;
		int q = query(m);

		if(q == x) {
			ans = m;
		}
		if(q >= x) {
			r = m-1;
		} else {
			l = m+1;
		}
	}

	return ans;
}

int main() {
	fin >> n >> m;
	for(int i = 1; i <= n; i++) {
		fin >> a[i];
		update(i, a[i]);
	}

	while(m--) {
		int t,a , b;
		fin >> t >> a;
		if(t == 2) {
			fout << bs(a) << '\n';
		} else if(t == 1) {
			fin >> b;
			fout << query(b)-query(a-1) << '\n';
		} else {
			fin >> b;
			update(a, b);
		}
	}
}