Cod sursa(job #3166911)

Utilizator poppinoConstantin David poppino Data 9 noiembrie 2023 19:04:06
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#include <array>
#include <iostream>
#include <chrono>
#include <fstream>

constexpr int nmax = 100000;

int aib[nmax + 5];
int n;

int ub(int x){

    return (x & (-x));

}

void add(int x, int y)
{

    for(int i = x; i <= n; i += ub(i)) {
        aib[i] += y;
    }

}

int sum(int x){
    int rez = 0;
    for(int i = x; i >= 1; i -= ub(i)){
        rez += aib[i];
    }
    return rez;
}

int main() {

    auto start = std::chrono::high_resolution_clock::now();


    std::ifstream in("grader_test6.in");
    std::ofstream out("grader_test6.out");

    int m;
    in >> n >> m;
    for(int i = 1; i <= n; i++){
        int x;
        in >> x;
        add(i, x);
    }

    for(int i = 0; i < m; i++) {
        int op, a, b;
        in >> op >> a;
        if(op == 0){
            in >> b;
            add(a, b);
        }else if(op == 1){
            in >> b;
            out << sum(b) - sum(a-1) << "\n";
        }else {
            int st = 0, dr = n; 
            int mij = st + (dr - st)/ 2;
            int minval = n + 1;
            while(st <= dr){
                if(sum(mij) == a){
                    if(mij < minval) minval = mij;
                    else break;
                } 
                if(sum(mij) <= a){
                    st = mij + 1;
                }else {
                    dr = mij - 1;
                }
                mij = st + (dr-st)/2; 
            }
            if(minval == n+1) minval = -1;
            out << minval << "\n";
        }
    }



    auto stop = std::chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
        
    std::cout << duration.count() / 1000.0f << " milliseconds" << std::endl;
}