Cod sursa(job #2917476)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 5 august 2022 12:43:13
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.82 kb
#include <bits/stdc++.h>
#define NMAX 100003

using namespace std;

int aib[NMAX], n, m;

class InParser {

private:

	static const int buffSZ = (1 << 15);

	ifstream File;

	int buffPos;

	char buff[buffSZ];

	void _advance() {

		if (++buffPos == buffSZ) {

			File.read(buff, buffSZ);

			buffPos = 0;

		}

	}

public:

	InParser(const char *FileName) {

		buffPos = buffSZ - 1;

		File.open(FileName);

	}

	InParser& operator >>(int &no) {

		while (!isdigit(buff[buffPos]))

			_advance();

		no = 0;

		while (isdigit(buff[buffPos])) {

			no = no * 10 + buff[buffPos] - '0';
			_advance();
		}
		return *this;
	}
};
	
InParser fin("aib.in");
ofstream fout("aib.out");

inline int step(int mask) {
	return ((mask ^ (mask - 1)) & mask);
}

void add_aib(int position, int value) {

	for (register int i = position; i <= n; i += step(i))
		aib[i] += value;
}

int querry_aib(int position) {

	int sum = 0;
	for (register int i = position; i > 0; i -= step(i))
		sum += aib[i];

	return sum;
}

int search_aib(int value) {
	
	register int step;
	for (step = 1; step < n; step <<= 1) {}

	register int i;
	for (i = 0; step; step >>= 1)
		if (i + step <= n && aib[i + step] <= value) {

			value -= aib[i + step];
			i += step;

			if (!value)
				return i;
		}

	return -1;

}

void solve() {

	fin >> n >> m;

	for (register int i = 1, x; i <= n; ++i) {
		fin >> x;
		add_aib(i, x);
	}

	for (int op = 1, type; op <= m; ++op) {
		fin >> type;

		if (type == 0) {
			int a, b;
			fin >> a >> b;
			add_aib(a, b);

		} else if (type == 1) {

			int a, b;
			fin >> a >> b;
			fout << querry_aib(b) - querry_aib(a - 1) << '\n';

		} else {

			int val;
			fin >> val;
			fout << search_aib(val) << '\n';
		}
	}

	memset(aib, 0, (n + 3) * sizeof(int));
}

int main() {

	int t = 1;
	// fin >> t;

	for(register int test = 1; test <= t; ++test)
		solve();
	return 0;
}