Cod sursa(job #2862720)

Utilizator QwertyDvorakQwerty Dvorak QwertyDvorak Data 5 martie 2022 19:19:53
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define mp make_pair
#define dbg(x) cout << #x <<": " << x << "\n";
using ll = long long;

const string myf = "aib";
ifstream fin(myf + ".in");
ofstream fout(myf + ".out");

const  int mod = 1999999973;

int n, m;
int a[100005];
int op, x, y;

void upd(int p, int x) {
	for (; p <= n; p += (p & (-p)))
		a[p] += x;
}

int qry(int p) {
	int ans = 0;
	for (; p >= 1; p -= (p & (-p)))
		ans += a[p];
	return ans;
}
int cb(int x) {
	int st, dr;
	st = 1; dr = n;
	int mid, ans = -1;
	while (st <= dr) {
		mid = (st + dr) >> 1;
		int val = qry(mid);
		if (val == x) {
			dr = mid - 1;
			ans = mid;
		}
		else if (val > x)
			dr = mid - 1;
		else st = mid + 1;
	}
	return ans;
}


int main() {

	fin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		fin >> x;
		a[i] += x;
		int nxt = i + (i & (-i));
		if (nxt <= n)
			a[nxt] += a[i];
	}
	while (m--) {
		fin >> op;
		if (op == 0) {
			fin >> x >> y;
			upd(x, y);
		}
		else if (op == 1) {
			fin >> x >> y;
			fout << qry(y) - qry(x - 1) << '\n';
		}
		else {
			fin >> x;
			fout << cb(x) << '\n';
		}
	}
	fin.close();
	fout.close();
	return 0;
}