Cod sursa(job #3246128)

Utilizator GoreaRaresGorea Rares-Andrei GoreaRares Data 1 octombrie 2024 22:03:25
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 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 s){
        int st = 1, dr = n;
        while(st <= dr){
            int mij = (st + dr) >> 1;
            if(sum(mij) < s)
                st = mij + 1;
            else
                dr = mij - 1;
        }
        return (sum(st) == s ? st : -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;
}