Cod sursa(job #3309512)

Utilizator ViAlexVisan Alexandru ViAlex Data 5 septembrie 2025 21:54:06
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

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

int n, q;
vector<int> tree;

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

void increment(int position, int value) 
{
	while(position <= n) {
		tree[position] += value;	
		position += lsb(position);
	}
}

int query(int position)
{
	int result = 0;

	while (position > 0) {
		result += tree[position];
		position -= lsb(position);
	}

	return result;
}

void read() {
	in>>n>>q;
	tree.resize(n+1);	
	int num;
	for (int i=1; i<=n;i++){
		in >> num;
		increment(i, num);
	}
}

int search(int sum) {
	int l = 1, r = n, m;
	while (l<r){
		m = (l+r)/2;
		if (query(m)<sum) {
			l = m+1;
		} else{
			r = m;
		}
	}
	if (query(l) == sum) {
		return l;
	}
	return -1;
}

int main(){
	read();
	int c, a, b;
	while(q--){
		in >> c;	
		if (c == 0) {
			in>>a>>b;
			increment(a, b);
		} else if( c==1 ){
			in>>a>>b;
			out<<query(b) - query(a-1)<<'\n';
		} else if (c==2){
			in>>a;
			out<<search(a)<<'\n';
		}
	}
	return 0;
}