Cod sursa(job #2288172)

Utilizator Raoul_16Raoul Bocancea Raoul_16 Data 22 noiembrie 2018 21:58:34
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
//
//  AIB.cpp
//  
//
//  Created by Raoul Bocancea on 22/11/2018.
//

#include <fstream>

const std :: string programName = "aib";
std :: ifstream f("aib.in");
std :: ofstream g("aib.out");

void Update(int, int);
int Query(int);
int intervalSum(int, int);
int QuerySearch(int, int);

const int NMAX = 1E5;

int N, M, AIB[NMAX + 5];

int main(void) {
    f >> N >> M;
    int pw2;
    for (pw2 = 1; pw2 <= N; pw2 *= 2);
        pw2 /= 2;
    for (int i = 1; i <= N; ++i) {
        int nr;
        f >> nr;
        Update(i, nr);
    }
    while (M--) {
        int quest;
        f >> quest;
        if (quest == 0) {
            int pos;
            int val;
            f >> pos >> val;
            Update(pos, val);
        } else if (quest == 1) { //AICI
            int left, right;
            f >> left >> right;
            g << intervalSum(left, right) << '\n';
        } else {
            int value;
            f >> value;
            g << QuerySearch(pw2, value) << '\n';
        }
    }
    return 0x0;
}

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

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

int intervalSum(int left, int right) {
    return Query(right) - Query(left - 1);
}

int QuerySearch(int pw2, int value) {
    for (int pos = 0, step = pw2; step; step /= 2)
        if ((pos + step) <= N and AIB[pos + step] <= value) {
            pos += step;
            value -= AIB[pos];
            if (!value)
                return pos;
        }
    return -1;
}