Cod sursa(job #2857960)

Utilizator DordeDorde Matei Dorde Data 26 februarie 2022 18:20:27
Problema Arbori indexati binar Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <bits/stdc++.h>

#define SZ 100001
using namespace std;
int N;
ifstream fin("aib.in");
ofstream fout("aib.out");
static constexpr int zeroes(int x) {
	return (x & (-x));
}

enum op {
	ADD = 0,
	SUM = 1,
	SHIT = 2
};

class aib {
	private:
		int v[SZ];
	public:
		void add(int p, int x) {
			for (int i = p; i <= N; i += zeroes(i)) {
				v[i] += x;
			}
		}

		int sum(int p) {
			int r = 0;
			for (int i = p; i > 0; i -= zeroes(i)) {
				r += v[i];
			}
			return r;
		}

		int thatOneShittyFunction(int x) {
			int pas = (1 << 16);
			int r = 0;
			int sum = 0;
			while (pas) {
				if (pas + r <= N && sum + v[pas + r] <= x) {
					r += pas;
					sum += v[r];
				}
				pas >>= 1;
			}
			if (sum == x) { return r; }
			return -1;
		}

};

int main([[maybe_unused]]int argc, [[maybe_unused]]char** argv) {

	aib bittree;

	fin >> N;
	int M = 0;
	fin >> M;
	for (auto i = 1; i <= N; i++) {
		int foo;
		fin >> foo;

		bittree.add(i, foo);
	}

	for (auto i = 0; i < M; i++) {

		int op;
		fin >> op;

		switch (op) {
			case op::ADD:
				{
					int p;
					int x;
					fin >> p >> x;
					bittree.add(p, x);
				}
				break;

			case op::SUM:
				{
					int x;
					int y;
					fin >> x >> y;
					int sum = bittree.sum(y) - bittree.sum(x - 1);

					fout << sum << '\n';
					fflush(stdout);
				}
				break;

			case op::SHIT:
				{
					int x;
					fin >> x;

					fout << bittree.thatOneShittyFunction(x) << '\n';
				}
				break;

			default:
				terminate();
		}

	}

	return 0;
}