Cod sursa(job #941853)

Utilizator howsiweiHow Si Wei howsiwei Data 19 aprilie 2013 21:46:44
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

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

class Fenwick {
public:
	Fenwick( int n ) :n(n) {
		a.resize(n+1);
		for (int i = 1; i <= n; ++i) {
			fin >> a[i];
		}
		for (msb = 1; msb <= n; msb <<= 1);
		msb >>= 1;

		for (int stp = 2; stp <= n; stp<<=1)
			for (int i = stp; i <= n; i += stp)
				a[i] += a[i-stp/2];
	}

	inline void update( int lo, int val ) {
		for (; lo <= n; lo += (lo & -lo))
			a[lo] += val;
	}

	inline int getsum( int lo, int hi ) {
		return getsum(hi)-getsum(lo-1);
	}

	inline int getsum( int hi ) {
		int sum = 0;
		for (; hi > 0; hi &= hi-1)
			sum += a[hi];
		return sum;
	}

	int idx_with_sum( int sum ) {
		int idx = 0;
		for (int stp = msb; stp > 0; stp >>= 1) {
			idx += stp;
			if (idx <= n && sum >= a[idx]) {
				sum -= a[idx];
				if (sum == 0) return idx;
			}
			else idx -= stp;
		}
		return -1;
	}

	vector<int> a;
	int n;
	int msb;
};

int main() {
	int n, m;
	fin >> n >> m;

	Fenwick bit(n);
	int op, lo, hi, val;

	for (int i = 0; i < m; ++i) {
		fin >> op;
		if (op == 0) {
			fin >> lo >> val;
			bit.update(lo, val);
		}
		else if (op == 1) {
			fin >> lo >> hi;
			fout << bit.getsum(lo, hi) << '\n';
		}
		else if (op == 2) {
			fin >> val;
			fout << bit.idx_with_sum(val) << '\n';
		}
	}

	return 0;
}