Cod sursa(job #941848)

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

class Fenwick {
public:
	Fenwick( vector<int> A ) {
		a.assign( A.begin(), A.end() );
		n = a.size()-1;
		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];
	}

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

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

	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() {
	ifstream fin("aib.in");
	ofstream fout("aib.out");
	int n, m;
	fin >> n >> m;
	vector<int> a(n+1);
	for (int i = 1; i <= n; ++i) {
		fin >> a[i];
	}

	Fenwick bit(a);
	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;
}