Cod sursa(job #2901031)

Utilizator raskyNichita Sincarenco rasky Data 12 mai 2022 19:38:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fcin("arbint.in");
ofstream fcout("arbint.out");

int arb[200000]; // 200000 <= 2*N-1
int n, m, i, a, b, x, op, poz;
// n - nr elemente
// m - nr operatii
// cod 0 - max[a, b]
// cod 1 - a = b

void update(int nod, int st, int dr);
int query(int nod, int st, int dr);

int main()
{   
    fcin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fcin>>x; // citim el
        poz = i; // actualizam arborele de la st = 1 la dr = n
        update(1, 1, n);
    }

    for(int i=1; i<=m; i++)
    {
        fcin>>op>>a>>b;
        if(op == 0)
            cout<< query(1, 1, n) << '\n';
        else {
            poz = a;
            x = b;
            update(1, 1, n);
        }
    }

    return 0;
}

void update(int nod, int st, int dr)
{
    int mij;
    if(st >= poz && dr <= poz) { // daca poz este valid
        arb[nod] = x; // se modifica nodul
        return;
    }
    mij = (st+dr) / 2; // stabilim mijlocul intervalului

    if( poz<=mij )
        update(nod*2, st, mij); // actualizare fiu stanga
    else 
        update(nod*2+1, mij+1, dr); // actualizare fiu dreapta
    arb[nod] = max(arb[nod*2+1], arb[nod*2]); // modificarea nodului

}

int query(int nod, int st, int dr)
{
    int mij, x1=0, x2=0;

    if(a<=st && dr<=b) // verficam daca intervalul [st, dr] este inclus in [a, b]
        return arb[nod]; 

    mij = (st+dr)/2;

    if(a<=mij)
        x1 = query(nod*2, st, mij); // fiu stanga
    if(b>mij)
        x2 = query(nod*2+1, mij+1, dr); // fiu dreapta

    if(x2>x1)
        x1 = x2;
    return x1;

}