Cod sursa(job #2817052)

Utilizator ElizaTElla Rose ElizaT Data 12 decembrie 2021 19:05:05
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 1e5;
int aib[NMAX + 5],v[NMAX + 5];
int bit,n,ans,pas;

void update(int poz, int val) {
    bit = 0;
    while (poz <= n) {
        aib[poz] += val;
        while (!(poz & (1 << bit)))
            bit++;
        poz += (1 << bit);
        bit++;
    }
}
int query(int poz) {
    ans = 0;
    bit = 0;
    while (poz) {
        ans += aib[poz];
        while (!(poz & (1 << bit)))
            bit++;
        poz -= (1 << bit);
        bit++;
    }
    return ans;
}
int cb(int val) {
    ans = 0;
    for (pas = 1;pas < n;pas <<= 1);
    for (;pas;pas >>= 1) {
        if (ans + pas <= n && val >= aib[ans + pas]) {
            ans += pas;
            val -= aib[ans];
            if (!val)
                return ans;
        }
    }
    return -1;
}
int main()
{
    ifstream fin("aib.in");
    ofstream fout("aib.out");
    int m,cer,a,b;
    fin >> n >> m;
    for (int i = 1;i <= n;i++){
        fin >> v[i];
        update(i, v[i]);
    }
    for (int i = 0;i < m;i++) {
        fin >> cer;
        if (cer == 0) {
            fin >> a >> b;
            update(a, b);
        }
        else if (cer == 1) {
            fin >> a >> b;
            fout << query(b) - query(a - 1) << '\n';
        }
        else {
            fin >> a;
            fout << cb(a) << '\n';
        }
    }
    return 0;
}