Cod sursa(job #3273670)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 3 februarie 2025 12:49:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int Nmax = 100005;

int n, q;
int sir[Nmax], aint[4 * Nmax];

void aint_build(int nod, int st, int dr){
    if(st == dr){
        aint[nod] = sir[st];
        return;
    }

    int mid = (st + dr) / 2;

    aint_build(2 * nod, st, mid);
    aint_build(2 * nod + 1, mid + 1, dr);

    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

void aint_update(int nod, int st, int dr, int poz, int val){
    if(st == poz && dr == poz){
        aint[nod] = val;
        return;
    }

    int mid = (st + dr) / 2;

    if(poz <= mid){
        aint_update(2 * nod, st, mid, poz, val);
    }
    else{
        aint_update(2 * nod + 1, mid + 1, dr, poz, val);
    }

    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

int aint_query(int nod, int st, int dr, int capat_st, int capat_dr){
    if(st == capat_st && dr == capat_dr){
        return aint[nod];
    }

    int mid = (st + dr) / 2;

    if(capat_dr <= mid){
        return aint_query(2 * nod, st, mid, capat_st, capat_dr);
    }
    else if(mid < capat_st){
        return aint_query(2 * nod + 1, mid + 1, dr, capat_st, capat_dr);
    }
    else{
        return max(aint_query(2 * nod, st, mid, capat_st, mid), aint_query(2 * nod + 1, mid + 1, dr, mid + 1, capat_dr));
    }
}

void citire_sir(){
    fin >> n >> q;
    for(int i = 1; i <= n; i++){
        fin >> sir[i];
    }
}

void citire_si_rezolvare_interogari(){
    int tip, poz, val, capat_st, capat_dr;

    for(int i = 1; i <= q; i++){
        fin >> tip;

        if(tip == 1){
            fin >> poz >> val;
            aint_update(1, 1, n, poz, val);
        }
        else{
            fin >> capat_st >> capat_dr;
            fout << aint_query(1, 1, n, capat_st, capat_dr) << '\n';
        }
    }
}

int main(){
    citire_sir();
    aint_build(1, 1, n);
    citire_si_rezolvare_interogari();

    return 0;
}