Cod sursa(job #2723420)

Utilizator BogdanRazvanBogdan Razvan BogdanRazvan Data 14 martie 2021 00:31:59
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>

using namespace std;

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

void usain_bolt()
{
    ios::sync_with_stdio(false);
    fin.tie(0);
}

const int N = 1e5 + 5;

int fen[N];

void add(int node, int val)
{
    for(; node <= N - 5; node += node & (-node)) {
        fen[node] += val;
    }
}

int sum(int node)
{
    int sol = 0;
    for(; node > 0; node -= node & (-node)) {
        sol += fen[node];
    }
    return sol;
}

int a[N];

int main()
{
    usain_bolt();

    int n, q;

    fin >> n >> q;
    for(int i = 1; i <= n; ++i) {
        fin >> a[i];
        add(i, a[i]);
    }
    for(; q; --q) {
        int type, x, y;

        fin >> type;
        if(type == 0) {

            fin >> x >> y;
            add(x, y);
        }
        else if(type == 1) {
            fin >> x >> y;

            fout << sum(y) - sum(x - 1) << "\n";
        }
        else {
            fin >> x;
            int left = 1, right = n, sol = -1;
            bool ok = false;
            while(left <= right && ok == false) {
                int mid = (left + right) >> 1;
                if(x < sum(mid)) {
                    right = mid - 1;
                }
                else if(x > sum(mid)) {
                    left = mid + 1;
                }
                else {
                    sol = mid;
                    ok = true;
                }
            }
            if(ok == true) {
                fout << sol << "\n";
            }
            else {
                fout << -1 << "\n";
            }
        }
    }
    return 0;
}