Cod sursa(job #3245983)

Utilizator GoreaRaresGorea Rares-Andrei GoreaRares Data 1 octombrie 2024 12:26:05
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;

int getPower(int n){
    int p;
    for(p = 1; p <= n; p <<= 1){}
    return (p >> 1);
}

struct aib{
    int n, v[10000001];
    void init(int n){
        this->n = n;
    }
    void add(int pos, int x){
        while(pos <= n){
            v[pos] += x;
            pos += pos & -pos;
        }
    }
    int sum(int pos){
        int rez = 0;
        while(pos){
            rez += v[pos];
            pos &= pos - 1;
        }
        return rez;
    }
    int rangeSum(int x, int y){
        return sum(y) - sum(x - 1);
    }
    int binSearch(int sum){
        int maxp = getPower(sum), pos = 0;
        for(int interval = maxp; interval; interval >>= 1){
            if(pos + interval <= n && v[pos + interval] < sum){
                sum -= v[pos + interval];
                pos += interval;
            }
        }
        return pos + 1;
    }
};

aib fen;

int main()
{
    ifstream cin("aib.in");
    ofstream cout("aib.out");
    int n, q, t, x, y;
    cin >> n >> q;
    fen.init(n);
    for(int i = 1; i <= n; i++){
        cin >> x;
        fen.add(i, x);
    }
    for(int i = 1; i <= q; i++){
        cin >> t >> x;
        if(t == 0)
            cin >> y, fen.add(x, y);
        else
            if(t == 1)
                cin >> y, cout << fen.rangeSum(x, y) << "\n";
            else
                cout << fen.binSearch(x) << "\n";
    }
    return 0;
}