Cod sursa(job #2226421)

Utilizator Raoul_16Raoul Bocancea Raoul_16 Data 30 iulie 2018 10:50:42
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
const int MAX = 1e5;
int Query(int, int[]);
int QuerySearch(int, int, int, int[]);
int intervalSum(int, int, int[]);
void Update(int, int, int, int[]);
int main(){
    std::ifstream f("aib.in");
    std::ofstream g("aib.out");
    int N, M;
    f >> N >> M;
    int pw2;
    for (pw2 = 1; pw2 <= N; pw2 *= 2);
        pw2 /= 2;
    int aib[MAX + 5];
    for (int i = 1; i <= N; ++i){
        int x;
        f >> x;
        Update(N, i, x, aib);
    }
    while (M--) {
        int quest;
        f >> quest;
        if (!quest){
            int position;
            int value;
            f >> position >> value;
            Update(N, position, value, aib);
        } else if (quest == 1){ //AICI
            int left, right;
            f >> left >> right;
            g << intervalSum(left, right, aib) << "\n";
        } else {
            int value;
            f >> value;
            g << QuerySearch(N, pw2, value, aib) << "\n";
        }
    }
    return 0;
}
int Query(int pos, int aib[]) {
    int ans = 0;
    for (int i = pos; i > 0; i -= (i & -i))
        ans += aib[i];
    return ans;
}
int QuerySearch(int N, int pw2, int value, int aib[]) {
    for (int pos = 0, step = pw2; step; step >>= 1)
        if ((pos ^ step) <= N and aib[pos ^ step] <= value){
            pos ^= step;
            value -= aib[pos];
            if(!value)
                return pos;
        }
    return -1;
}
int intervalSum(int left, int right, int aib[]) {
    return Query(right, aib) - Query(left - 1, aib);
}
void Update(int N, int pos, int val, int aib[]) {
    for (int i = pos; i <= N; i += (i & -i))
        aib[i] += val;
}