Cod sursa(job #3164913)

Utilizator ScipexRobert Chiri Scipex Data 4 noiembrie 2023 19:17:03
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, x, y, t;

int lsb(int x) {
    return (x & (-x));
}

struct Aib {
    int v[100001];

    void add(int x, int poz) {
        while (poz <= n) {
            v[poz] += x;
            poz += lsb(poz);
        }
    }

    int sum(int poz) {
        int s = 0;
        while (poz) {
            s += v[poz];
            poz -= lsb(poz);
        }
        return s;
    }

    int search(int x) {
        int s = 1;
        while (s < n) {
            s *= 2;
        }
        for (int i = 0; s; s /= 2) {
            if (i + s <= n) {
                if (x >= v[i + s]) {
                    x -= v[i + s];
                    i += s;
                    if (x == 0) {
                        return i;
                    }
                }
            }
        }

        return -1;
    }
} aib;

int main() {
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> x;
        aib.add(x, i);
    }

    for (int i = 0; i < m; i++) {
        fin >> t >> x;
        if (t == 0) {
            fin >> y;
            aib.add(y, x);
        } else if (t == 1) {
            fin >> y;
            fout << aib.sum(y) - aib.sum(x - 1) << "\n";
        } else {
            fout << aib.search(x) << "\n";
        }
    }
}