Cod sursa(job #3320312)

Utilizator nicoleta_iancuIancu Nicoleta nicoleta_iancu Data 4 noiembrie 2025 21:33:05
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <fstream>
#include <vector>
#define int long long

using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
vector<int>aib;
int n;
int lsb(int val) {
    return val & (-val);
}
int query(int x) {
    int sum = 0;
    for (int i = x; i >= 1; i -= lsb(i)) {
        sum += aib[i];
    }
    return sum;
}
void update(int x, int val) {
    for (int i = x; i <= n; i += lsb(i)) {
        aib[i] += val;
    }
}
int cb(int val) {
    int pow2 = 2 << 17;
    int pozi = 0;
    int crt = 0;
    for (int i = pow2; i > 0; i /= 2) {
        if (pozi + i <= n && crt+aib[i]<=val) {
            pozi += i;
            crt +=  aib[i];
        }
    }
    return pozi;
}
vector<int>v;
int_fast32_t main()
{
    int teste;
    fin >> n >> teste;
    v.resize(n + 1);
    aib.resize(n * n + 2);
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
        update(i, v[i]);
    }
    for (int i = 0; i < teste; ++i) {
        int cer = 0;
        fin >> cer;
        if (cer == 0) {
            int x, val;
            fin >> x >> val;
            update(x, val);
        }
        else if (cer == 1) {
            int st, dr;
            fin >> st >> dr;
            if (st != 0) {
                fout << query(dr) - query(st - 1) << endl;
            }
            else {
                fout << query(dr) << endl;
            }
        }
        else if (cer == 2) {
            int x;
            fin >> x;
            fout << cb(x) << endl;
        }
    }
    return 0;
}