Cod sursa(job #2672823)

Utilizator vansJos da pa perete vans Data 14 noiembrie 2020 23:09:36
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 2e5;

int n, m, a[NMAX + 1], bit[NMAX + 1], x, y, op;

inline void updBIT(int POZ, const int VAL) {
    for(; POZ <= n; POZ += (POZ & -POZ))
        bit[POZ] += VAL;
}

inline int query(int POZ) {
    int TORET = 0;
    for(; POZ; POZ -= (POZ & -POZ))
        TORET += bit[POZ];
    return TORET;
}

inline int query2(const int QUERY) {
    int st = 1, dr = n, mij;
    while(st <= dr) {
        mij = (st + dr) / 2;
        int rez = query(mij);
        if(rez == QUERY) return mij;
        else if(rez > QUERY) dr = mij - 1;
        else st = mij + 1;
    }
    return -1;
}

void constrBIT() {
    for(int i = 1; i <= n; ++i)
        updBIT(i, a[i]);
}

int main()
{
    freopen("aib.in", "r", stdin);
    freopen("aib.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    constrBIT();
    while(m--) {
        scanf("%d", &op);
        if(op == 0)
            scanf("%d%d", &x, &y),
            updBIT(x, y);
        else if(op == 1)
            scanf("%d%d", &x, &y),
            printf("%d\n", query(y) - query(x - 1));
        else scanf("%d", &x), printf("%d\n", query2(x));
    }
    return 0;
}