Cod sursa(job #3197388)

Utilizator CzarPopescu Cezar Stefan Cristian Czar Data 26 ianuarie 2024 18:28:17
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include <iostream>
#include <vector>
#include <climits>
#include<unordered_map>
#include <algorithm>
#include <set>
#include<string>
#include<map>
#include<queue>
#include<cmath>
#include<fstream>
#include<list>
#include<iomanip>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
#define INF 1000000

int A[100005];
int n;
void update(int poz, int n, int val) {
	for (int i = poz; i <= n; i+=(i&-i)) {
		A[i]+=val;
	}
}

int query(int poz, int n) {
	int sum = 0;
	for (int i = poz; i; i -= (i & -i)) {
		sum += A[i];
	}
	return sum;
}

int binar(int n, int a) {
	int st = 1, dr = n;
	while (st <= dr) {
		int mijl = (dr + st) / 2;
		int val = query(mijl, n);
		if (val == a)return mijl;
		else if (val < a)st = mijl + 1;
		else dr = mijl;
	}
	return -1;
}
int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, m;
	in >> n>>m;
	for (int i = 1; i <= n; i++) {
		int x;
		in >> x;
		update(i, n, x);
	}
	while (m--) {
		int op;
		in >> op;
		if (op == 0) {
			int a, b;
			in >> a >> b;
			update(a, n, b);
		}
		else if (op == 1) {
			int a, b;
			in >> a >> b;
			out << query(b, n) - query(a - 1, n) << "\n";
		}
		else {
			int a;
			in >> a;
			out << binar(n, a)<<"\n";
		}
	}
}