Cod sursa(job #2988733)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 5 martie 2023 13:47:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <cmath>

using namespace std;

const int Nmax = 100000;
const int Sq_n = sqrt(Nmax);
const int BatogSize = (Nmax + Sq_n - 1) / Sq_n;

int v[Nmax], batog[BatogSize];

void update(int a, int b){
    int nrinterval;

    nrinterval = a / Sq_n;
    v[a] = b;

    batog[nrinterval] = 0;

    for(int i = Sq_n * nrinterval; i < Sq_n * (nrinterval + 1); i++){
        batog[nrinterval] = max(batog[nrinterval], v[i]);
    }
}

int query(int a, int b){
    int firstinterval, lastinterval, result;

    firstinterval = (a + Sq_n - 1) / Sq_n * Sq_n;
    lastinterval = b / Sq_n * Sq_n;

    result = 0;
    while(a <= b && a < firstinterval){
        result = max(result, v[a]);
        a++;
    }
    while(a <= b && lastinterval <= b){
        result = max(result, v[b]);
        b--;
    }

    firstinterval /= Sq_n;
    lastinterval /= Sq_n;

    while(firstinterval < lastinterval){
        result = max(result, batog[firstinterval]);
        firstinterval++;
    }

    return result;
}

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

    int n, m, optype, a, b, nrinterval, cnt;

    fin >> n >> m;

    nrinterval = 0;
    cnt = 0;
    batog[0] = 0;
    for(int i = 0; i < n; i++){
        fin >> v[i];

        batog[nrinterval] = max(batog[nrinterval], v[i]);
        cnt++;

        if(cnt >= Sq_n){
            cnt = 0;
            nrinterval++;
            batog[nrinterval] = 0;
        }
    }

    for(int i = 0; i < m; i++){
        fin >> optype >> a >> b;

        if(optype == 0){
            fout << query(a - 1, b - 1) << '\n';
        }
        else{
            update(a - 1, b);
        }
    }
    return 0;
}