Cod sursa(job #3192726)

Utilizator vlad_binVlad Bintintan vlad_bin Data 13 ianuarie 2024 10:50:10
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

#define NMAX 100'005

int tree[NMAX];
int n, m;

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

void add(int poz, int val) {
    for (int i = poz; i <= n; i += (i & (-i)))
        tree[i] += val;
}

int sum(int poz) {
    int rez = 0;
    for (int i = poz; i != 0; i -= (i & (-i)))
        rez += tree[i];
    return rez;
}

int minPoz(int val) {
    int mask = 1;
    while (mask <= n) mask <<= 1;
    mask >>= 1;

    int position = 0;
    for (; mask > 0; mask >>= 1)
        if (position + mask <= n and tree[position + mask] <= val) {
            val -= tree[position + mask];
            position += mask;
            if (val == 0)
                return position;
        }
    return -1;
}

int main() {
    in >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x;
        in >> x;
        for (int j = i; j <= n; j += (j & (-j)))
            tree[j] += x;
    }
    int qtype;
    int a,b;
    while(m--) {
        in >> qtype;
        if (qtype == 0) {
            in >> a >> b;
            add(a, b);
        }
        if (qtype == 1) {
            in >> a >> b;
            out << sum(b) - sum(a-1) << '\n';
        }
        if (qtype == 2) {
            in >> a;
            out << minPoz(a) << '\n';
        }
    }
}