Cod sursa(job #2857946)

Utilizator ItsTheFBIaaa Dani ItsTheFBI Data 26 februarie 2022 18:06:00
Problema Arbori indexati binar Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <cstdlib>
#include <exception>
#include <iostream>

#define SZ 1000001

static int N;

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 (static_cast<bool>(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) {
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);

	aib bittree;
	
	std::cin >> N;
	int M = 0;
	std::cin >> M;
	for (auto i = 0; i < N; i++) {
		int foo = 0;
		std::cin >> foo;

		bittree.add(i + 1, foo);		
	}

	for (auto i = 0; i < M; i++) {
		
		int op = 0;
		std::cin >> op;

		switch (op) {
			case op::ADD:
				{
					int p = 0;
					int x = 0;
					std::cin >> p >> x;
					bittree.add(p, x);
				}
				break;

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

					printf("%u\n", sum);
				}	
				break;

			case op::SHIT:
				{
					int x = 0;
					std::cin >> x;

					printf("%i\n", bittree.thatOneShittyFunction(x));
				}
				break;
			
			default:
				std::terminate();
		}

	}

	return 0;
}