Cod sursa(job #1125765)

Utilizator harababurelPuscas Sergiu harababurel Data 26 februarie 2014 19:21:14
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <iostream>
#include <fstream>
#define nmax 100005
using namespace std;

int n, m, op, a, b, x, lo, mid, hi, aib[nmax];

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

void add(int idx, int val) {
	while(idx < nmax) {
		aib[idx] += val;
		idx += idx & (-idx);
	}
}

int main() {
	ifstream f("aib.in");
	ofstream g("aib.out");

	f>>n>>m;
	for(int i=1; i<=n; i++) {
		f>>x;
		add(i, x);
	}
	for(int i=1; i<=m; i++) {
		f>>op>>a;
		if(op == 0) f>>x, add(a, x); 
		if(op == 1) f>>b, g<<sum(b) - sum(a-1)<<"\n";
		if(op == 2) {
			lo = 0;
			hi = n+1;
			while(hi - lo > 1) {
				mid = (lo + hi) >> 1;
				if(sum(mid) < a) lo = mid;
				else hi = mid;
			}
			g<<(sum(hi) == a? hi:-1)<<"\n";
		}
	}

	return 0;
}