Cod sursa(job #2675266)

Utilizator davidcotigacotiga david davidcotiga Data 21 noiembrie 2020 11:47:09
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <map>

using namespace std;

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

const int NMAX = 2e5;

int n, m, a[NMAX + 1], bit[NMAX + 1], x, y, op;

inline void updBIT(int POZ, const int VAL) {
	for (; POZ <= n; POZ += (POZ & -POZ))
		bit[POZ] += VAL;
}

inline int query(int POZ) {
	int TORET = 0;
	for (; POZ; POZ -= (POZ & -POZ))
		TORET += bit[POZ];
	return TORET;
}

inline int query2(const int QUERY) {
	int st = 1, dr = n, mij;
	while (st <= dr) {
		mij = (st + dr) / 2;
		int rez = query(mij);
		if (rez == QUERY) return mij;
		else if (rez > QUERY) dr = mij - 1;
		else st = mij + 1;
	}
	return -1;
}

void constrBIT() {
	for (int i = 1; i <= n; ++i)
		updBIT(i, a[i]);
}

int main()
{
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
		fin >> a[i];
	constrBIT();
	while (m--) {
		fin >> op;
		if (op == 0) {
			fin >> x >> y;
			updBIT(x, y);
		}
		else if (op == 1) {
			fin >> x >> y;
			fout << query(y) - query(x - 1) << "\n";
		}
		else {
			fin >> x;
			fout << query2(x) << "\n";
		}
	}
	return 0;
}