Cod sursa(job #1076280)

Utilizator dunhillLotus Plant dunhill Data 10 ianuarie 2014 00:01:32
Problema Arbori indexati binar Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
using namespace std;

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

#define nmax 100001

int i, n, m;
int ret;
int AIB[nmax];

inline void update(int i, int v) {
	for (int u = i; u <= n; u += (u & -u)) AIB[u] += v;
}

inline int query(int i) {
	int ans = 0;
	for (int u = i; u >= 1; u -= (u & -u)) ans += AIB[u];
	return ans;
}

inline int search(int a) {
	int i, ans, q, cnt = ret;
	if (query(n) == a) return n;
	for (i = n; cnt; cnt >>= 1) {
		if (i - cnt >= 0) q = query(i - cnt);
		else 
			continue;
		if (q >= a) {
			if (q == a) ans = i - cnt;
			i -= cnt;
		}
	}
	return ans;
}

int op, a, b;

int main() {
	fin >> n >> m;
	for (i = 1; i <= n; ++i) fin >> AIB[i];
	for (ret = 1; ret <= n; ret <<= 1);
	for (i = 1; i <= n; ++i)
		AIB[i + (i & -i)] += AIB[i];
	for (i = 1; i <= m; ++i) {
		fin >> op >> a;
		if (op == 0) {
			fin >> b;
			update(a, b);
		}
		if (op == 1) {
			fin >> b;
			fout << query(b) - query(a - 1) << '\n';
		}
		if (op == 2) 
			fout << search(a) << '\n';
	}
	return 0;
}