Cod sursa(job #3352274)

Utilizator adri22adria gram adri22 Data 26 aprilie 2026 11:32:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

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

long long m, n, s;
vector <long long> a;
vector <long long> b;

int op0(int st, int dr)
{
    int maxim_gasit = -1;
    int bloc_start = (st - 1) / s;
    int bloc_final = (dr - 1) / s;

    if(bloc_start == bloc_final)
    {
        for(int i = st; i <= dr; i++)
        {
            if (a[i] > maxim_gasit)
                maxim_gasit = a[i];
        }
    }
    else
    {
        int limita_bloc = (bloc_start + 1) * s;
        for(int i = st; i <= limita_bloc; i++)
        {
            if (a[i] > maxim_gasit)
                maxim_gasit = a[i];
        }

        for (int i = bloc_start + 1; i < bloc_final; i++)
        {
            if(b[i] > maxim_gasit)
                maxim_gasit = b[i];
        }
        int inceput_bloc_final = bloc_final * s + 1;
        for (int i = inceput_bloc_final; i <= dr; i++)
        {
            if (a[i] > maxim_gasit) maxim_gasit = a[i];
        }
    }
    return maxim_gasit;
}

void actualizeaza(int poz, int valoare) {
    a[poz] = valoare;
    int id = (poz - 1) / s;
    int inceput = id * s + 1;
    int sfarsit = min((id + 1) * s, n);

    b[id] = -1;
    for (int i = inceput; i <= sfarsit; i++) {
        if (a[i] > b[id]) b[id] = a[i];
    }
}

int main()
{
    fin >> n >> m;
    int op, st, dr;
    s = sqrt(n);
    int nr_blocuri = (n + s - 1)/s;
    b.assign(nr_blocuri, -1);
    a.resize(n+1);
    for(int i = 1; i <= n; i++)
    {
        fin >> a[i];
        int id_bloc = (i - 1) / s;
        if(a[i] > b[id_bloc])
            b[id_bloc] = a[i];
    }

    for(int i = 0; i < m; i++)
    {
        fin >> op >> st >> dr;
        if(op == 0)
        {
            fout << op0(st, dr) << "\n";
        }
        else
            actualizeaza(st, dr);
    }
    return 0;
}