Cod sursa(job #3196009)

Utilizator dumitrache12Dumitrache Iulian dumitrache12 Data 22 ianuarie 2024 14:18:08
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include<bits/stdc++.h>
using namespace std;

const int N = 100009;

ifstream in ("aib.in");
ofstream out("aib.out");
// auto& in = cin;
// auto& out = cout;

int n, m;
long long tree[N];

long long read(int idx) {
	long long total = 0;
	while(idx) {
		// out<<"reading "<<idx<<endl;
		total += tree[idx];
		idx -= (idx & -idx);
	}
	return total;
}

void update(int idx, int val) {
	while(idx <= n) {
		// out<<"updating "<<idx<<endl;
		tree[idx] += val;
		idx += (idx & -idx);
	}
}

int find(long long cumFreq) {
	int idx = 0;
	for(long long bitM = 1 << 30; bitM; bitM /= 2) {
		int checkP = idx + bitM;
		if(checkP <= n && tree[checkP] <= cumFreq) {
			cumFreq -= tree[checkP];
			idx = checkP;
		}
	}
	if(!cumFreq)	return idx;
	return -1;

}

int main(){
	in>>n>>m;
	int x;
	for(int i = 1; i <= n; i++) {
		in>>x;
		update(i, x);
	}

	int op, a, b;
	for(int i = 0; i < m; i++) {
		in>>op;
		switch(op) {
		case 0:
			in>>a>>b;
			update(a, b);
			break;
		case 1:
			in>>a>>b;
			out<<read(b) - read(a-1)<<endl;
			break;
		default:
			in>>a;
			out<<find(a)<<endl;
		}
	}
	
	return 0;
}