Cod sursa(job #2487660)

Utilizator Dragos1226Dragos Chileban Dragos1226 Data 5 noiembrie 2019 17:11:19
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<cmath>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
const int NMax = 100000;

int N, M, AIB[NMax+5], K;

void Update(int X, int V) {
    for(int i = X; i <= N; i += (i&(-i)))
        AIB[i] += V;
}

int Query(int X) {
    int S = 0;
    for (int i = X; i > 0; i -= (i&(-i)))
        S += AIB[i];
    return S;
}

int Search(int V) {
    int Step = 0;
    for(int k = (1 << K); k > 0; k >>= 1)
        if(Step + k <= N && Query(Step + k) < V)
            Step += k;
    return ((Query(Step + 1) == V) ? Step + 1 : -1);
}

int main() {
    in >> N >> M;
    for (int i = 1,x; i <= N; i++) {
        in >> x;
        Update(i,x);
    }
    K = log2(N);
    while(M--) {
        int Type,x,y;
        in >> Type >> x;
        if(Type == 0) {
            in >> y;
            Update(x,y);
        }
        if(Type == 1) {
            in >> y;
            out << Query(y) - Query(x-1) << '\n';
        }
        if(Type == 2) {
            out << Search(x) << '\n';
        }
    }
    return 0;
}