Cod sursa(job #3134240)

Utilizator CiprianHutanuHutanu Ciprian CiprianHutanu Data 28 mai 2023 19:51:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include <iostream>
#include <vector>

std::ifstream in;
std::ofstream out;

class AINT{
    std::vector<int> v;
    int maxx;
public:
    AINT(){
        v.resize(400005);
        maxx = -1;
    }
    void update(int, int, int, int, int);
    void query(int, int, int, int, int);
    void resetMax(){
        maxx = -1;
    }
    int getMax(){
        return maxx;
    }
};

void AINT::update(int node, int left, int right, int pos, int x) {
    if(left == right){
        v[node] = x;
        return;
    }
    else{
        int mid = (left + right) / 2;
        if(pos <= mid){
            update(2*node, left, mid, pos, x);
        }
        else{
            update(2*node + 1, mid + 1, right, pos, x);
        }
        v[node] = std::max(v[2*node], v[2*node+1]);
    }
}

void AINT::query(int node, int left, int right, int a, int b) {
    if(a<=left and right<=b){
        if(v[node] > maxx)
            maxx = v[node];
        return;
    }
    else{
        int mid = (left + right) / 2;
        if(a <= mid)
            return query(2*node, left, mid, a, b);
        if(b >= mid)
            return query(2*node + 1, mid + 1, right, a ,b);
    }
}


int main() {
    int n, i , m, op, a, b, x;
    in.open("arbint.in");

    in>>n>>m;
    AINT aint;
    for(i=0;i<n;i++){
        in>>x;
        aint.update(1, 1, n, i + 1  , x);
    }
    out.open("arbint.out");

    for(i = 0; i < m; i++){
        in>>op>>a>>b;
        if(op == 0){
            aint.resetMax();
            aint.query(1,1,n,a,b);
            out<<aint.getMax() << '\n';
        }
        else{
            aint.update(1,1,n,a,b);
        }
    }

    in.close();
    out.close();

    return 0;
}