Cod sursa(job #3305727)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 4 august 2025 14:50:31
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.33 kb
#include <fstream>
#include <cmath>

using namespace std;

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

const int Nmax = 100005;
const int SqrtNmax = 320;

int n, q, marime_bucket;
int elemente[Nmax], maxim_pe_bucket[SqrtNmax];

void citire_elemente(){
    int nr_bucket;

    fin >> n >> q;
    marime_bucket = sqrt(n);

    nr_bucket = -1;
    for(int i = 0; i < n; i++){
        if(i % marime_bucket == 0){
            nr_bucket++;
        }

        fin >> elemente[i];
        maxim_pe_bucket[nr_bucket] = max(maxim_pe_bucket[nr_bucket], elemente[i]);
    }
}

void update(int pozitie, int valoare){
    int indice = pozitie / marime_bucket;
    elemente[pozitie] = valoare;

    maxim_pe_bucket[indice] = 0;
    int primul_element = indice * marime_bucket;
    for(int i = 0; i < marime_bucket && primul_element + i < n; i++){
        maxim_pe_bucket[indice] = max(maxim_pe_bucket[indice], elemente[primul_element + i]);
    }
}

int query(int stanga, int dreapta){
    int sol = 0, indice_stanga, indice_dreapta, capat_dr, capat_st;

    indice_stanga = stanga / marime_bucket;
    capat_dr = (indice_stanga + 1) * marime_bucket - 1;

    indice_dreapta = dreapta / marime_bucket;
    capat_st = indice_dreapta * marime_bucket;

    if(indice_stanga == indice_dreapta){
        for(int i = stanga; i <= dreapta; i++){
            sol = max(sol, elemente[i]);
        }
    }
    else{
        for(int i = stanga; i <= capat_dr; i++){
            sol = max(sol, elemente[i]);
        }

        for(int i = capat_st; i <= dreapta; i++){
            sol = max(sol, elemente[i]);
        }

        for(int i = indice_stanga + 1; i < indice_dreapta; i++){
            sol = max(sol, maxim_pe_bucket[i]);
        }
    }

    return sol;
}

void citire_si_rezolvare_interogari(){
    bool tip;
    int stanga, dreapta, pozitie, valoare;

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

        if(tip){
            fin >> pozitie >> valoare;
            pozitie--;

            update(pozitie, valoare);
        }
        else{
            fin >> stanga >> dreapta;
            stanga--; dreapta--;

            fout << query(stanga, dreapta) << '\n';
        }
    }
}

int main(){
    citire_elemente();
    citire_si_rezolvare_interogari();

    return 0;
}