Cod sursa(job #2833619)

Utilizator VINTREXNume complet VINTREX Data 15 ianuarie 2022 14:05:59
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>

using namespace std;

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

int parinte[400001];

void cautam_interval(int nod, int inceput, int sfarsit, int pozitie, int numar)
{
    if(inceput==sfarsit)
       {
           parinte[nod]=numar;
           return;
       }
    int mijloc=(inceput+sfarsit)/2;
    if(pozitie>mijloc)
        cautam_interval(2*nod+1, mijloc+1, sfarsit, pozitie, numar);
    if(pozitie<=mijloc)
        cautam_interval(2*nod, inceput, mijloc, pozitie, numar);
    parinte[nod]=max(parinte[2*nod], parinte[2*nod+1]);
}
int afisare_maxim(int nod, int inceput, int sfarsit, int inceput_interval,int sfarsit_interval)
{
    if(inceput>=inceput_interval&&sfarsit<=sfarsit_interval)
        return parinte[nod];
    else
    {
        int mijloc=(inceput+sfarsit)/2, maxim=0;
        if(inceput_interval<=mijloc)
            maxim=max(maxim, afisare_maxim(2*nod, inceput, mijloc, inceput_interval, sfarsit_interval));
        if(sfarsit_interval>mijloc)
            maxim=max(maxim, afisare_maxim(2*nod+1, mijloc+1, sfarsit, inceput_interval, sfarsit_interval));
        return maxim;
    }
}
int main()
{
    int n, m;
    fin >> n >> m;
    for(int i=1; i<=n; i++)
    {
        int auxiliar;
        fin >> auxiliar;
        cautam_interval(1, 1, n, i, auxiliar);
    }
    for(int i=1; i<=m; i++)
    {
        int inceput, sfarsit, cerinta;
        fin >> cerinta >> inceput >> sfarsit;
        if(cerinta==1)
            cautam_interval(1, 1, n, inceput, sfarsit);
        else
            fout << afisare_maxim(1, 1, n, inceput, sfarsit) << '\n';
    }
}