Cod sursa(job #3231408)

Utilizator BogdancxTrifan Bogdan Bogdancx Data 26 mai 2024 12:21:38
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

struct AIB {
    std::vector<int> bit;
    int n;

    AIB() = default;

    explicit AIB(int n) {
        this->n = n;
        bit.assign(n+1, 0);
    }
    explicit AIB(std::vector<int> &a) : AIB(a.size()) {
        for(int i = 1; i <= a.size(); i++) {
            update(i, a[i]);
        }
    }

    int sum(int r) {
        int res = 0;
        while(r > 0) {
            res += bit[r];
            r -= (r & -r);
        }

        return res;
    }

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

    void update(int idx, int val) {
        while(idx <= this->n) {
            bit[idx] += val;
            idx += (idx & -idx);
        }
    }

    int pozmin(int s) {
        int k = -1;
        int left = 1, right = this->n;

        while(left <= right) {
            int mid = left + (right - left) / 2;

            int suma = sum(mid);

            if(suma >= s) {
                right = mid - 1;

                if(suma == s) k = mid;
            }
            else {
                left = mid + 1;
            }
        }

        return k;
    }
};

#define TE41ST
const std::string file = "aib";

int main() {
#ifdef TEST
    std::ifstream fin("../test.in");
    std::ofstream fout("../output.out");
#endif

#ifndef TEST
    std::ifstream fin(file + ".in");
    std::ofstream fout(file + ".out");
#endif

    int n, m;

    fin >> n >> m;

    std::vector<int> v(n+1);

    for(int i = 1; i <= n; i++) {
        fin >> v[i];
    }

    AIB aib{v};

    for(int i = 0; i < m; i++) {
        int op;

        fin >> op;

        if(op == 0) {
            int a, b;

            fin >> a >> b;

            aib.update(a, b);
        }
        else if(op == 1) {
            int a, b;
            fin >> a >> b;
            fout << aib.sum(a, b) << '\n';
        }
        else {
            int a;
            fin >> a;

            int k = aib.pozmin(a);

            fout << k << '\n';
        }
    }

    fin.close();
    fout.close();

    return 0;
}