Cod sursa(job #2702391)

Utilizator ssenseEsanu Mihai ssense Data 3 februarie 2021 21:04:32
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.02 kb
#include <bits/stdc++.h>
#define startt ios_base::sync_with_stdio(false);cin.tie(0);
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
typedef unsigned long long ull;
typedef long long  ll;
using namespace std;
#define FOR(n) for(int i=0;i<n;i++)
#define vt vector
#define vint vector<int>
#define all(v) v.begin(), v.end()
#define sz(a) (int)a.size()
#define MOD 1000000007
#define MOD2 998244353
#define MX 1000000000
#define nax 100005
#define MXL 1000000000000000000
#define PI 3.14159265
#define pb push_back
#define pf push_front
#define sc second
#define fr first
#define int ll
#define endl '\n'
#define ld long double

vector<int> read(int n) {vector<int> a; for (int i = 0; i < n; i++) { int x; cin >> x; a.pb(x);} return a;}

struct FenwickTree {
	vector<int> bit;  // binary indexed tree
	int n;

	FenwickTree(int n) {
		this->n = n;
		bit.assign(n, 0);
	}

	FenwickTree(vector<int> a) : FenwickTree(a.size()) {
		for (size_t i = 0; i < a.size(); i++)
			add(i, a[i]);
	}

	int sum(int r) {
		int ret = 0;
		for (; r >= 0; r = (r & (r + 1)) - 1)
			ret += bit[r];
		return ret;
	}

	int sum(int l, int r) {
		return sum(r) - sum(l - 1);
	}

	void add(int idx, int delta) {
		for (; idx < n; idx = idx | (idx + 1))
			bit[idx] += delta;
	}
};


int32_t main(){
	startt;
	freopen("aib.in", "r", stdin);
	freopen("aib.out", "w", stdout);
	int n, m;
	cin >> n >> m;
	vint a = read(n);
	FenwickTree ft(a);
	for(int i = 0; i < m; i++)
	{
		int c;
		cin >> c;
		if(c == 0)
		{
			int a, b;
			cin >> a >> b;
			ft.add(a-1, b);
		}
		if(c == 1)
		{
			int l , r;
			cin >> l >> r;
			cout << ft.sum(l-1, r-1) << endl;
		}
		if(c == 2)
		{
			int a;
			cin >> a;
			int l = 0, r = n-1;
			while(l < r)
			{
				int mid = l+(r-l)/2;
				if(ft.sum(mid) == a)
				{
					l = mid;
					break;
				}
				if(ft.sum(mid) > a)
				{
					r = mid-1;
				}
				else
				{
					l = mid+1;
				}
			}
			int x = ft.sum(l);
			if(x != a)
			{
				cout << -1 << endl;
			}
			else
			{
				cout << l+1 << endl;
			}
		}
	}
}