Cod sursa(job #2907485)

Utilizator disinfoion ion disinfo Data 30 mai 2022 15:15:37
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#include <iostream>
#define MAX 100010
using namespace std;

int aib[MAX];
int n;


void update(int idx, int val_to_add){
	while(idx <= n){
		aib[idx] += val_to_add;
		idx += (idx & -idx);
	}
}


int cumulative_sum(int idx){
	int sum = 0;
	while(idx){
		sum += aib[idx];
		idx -= (idx & -idx);
	}
	return sum;
}


int bin_search(int sum, int l, int r){
	if(l == r)
		if(cumulative_sum(l) == sum)
			return l;
		else
			return -1;

	int mid = (l + r) / 2;
	int test = cumulative_sum(mid);
	if(sum <= test)
		return bin_search(sum, l, mid);
	else
		return bin_search(sum, mid + 1, r);
}

int main(){
	ifstream fin;
	ofstream fout;
	fin.open("aib.in");
	fout.open("aib.out");

	int m, q, a, b, i;
	int val;
	fin >> n >> m;

	for(i=1; i <= n; ++i){
		fin >> val;
		update(i, val);
	}

	for(i=0; i < m; ++i){
		fin >> q;
		if(q == 0){
			fin >> a >> b;
			update(a, b);
		}
		else if(q == 1){
			fin >> a >> b;
			fout << cumulative_sum(b) - cumulative_sum(a - 1) << "\n";
		}
		else{
			fin >> a;
			fout << bin_search(a, 1, n) << "\n";
		}
	}
}