Cod sursa(job #2710998)

Utilizator marius004scarlat marius marius004 Data 23 februarie 2021 15:56:49
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <stdio.h>

const int NMAX = 100'001;
int arr[NMAX], n, queries, bit[NMAX];

inline int lsb(int nr) {
    return nr & -nr;
}

void update(int index, int value) {

    for(int i = index;i <= n;i += lsb(i))
        bit[i] += value;
}

int accumulate(int index) {

    int ret{};

    for(;index;index -= lsb(index))
        ret += bit[index];

    return ret;
}

int query2(int a) {

    int left{ 1 }, right { n }, ret { -1 };

    while(left <= right) {

        int mid = (left + right) / 2,
            s = accumulate(mid);

        if(s == a) {
            ret = mid;
            right = mid - 1;
        }else if(s < a)
            left = mid + 1;
        else
            right = mid - 1;
    }

    return ret;
}

int main() {

    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);

    scanf("%d%d", &n, &queries);

    for(int i = 1;i <= n;++i) {
        int x;
        scanf("%d", &x);

        update(i, x);
    }

    for(;queries--;) {

        int type;
        scanf("%d", &type);

        if(type == 0) {
            int ind, b;
            scanf("%d%d", &ind, &b);

            update(ind, b);
        }else if(type == 1) {
            int a, b;
            scanf("%d%d", &a, &b);

            printf("%d\n", accumulate(b) - accumulate(a - 1));
        } else {
          int a;
          scanf("%d", &a);

          printf("%d\n", query2(a));
        }
    }

    return 0;
}