Cod sursa(job #3123154)

Utilizator SorinBossuMarian Sorin SorinBossu Data 22 aprilie 2023 12:00:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");
const int nmax = 100001;
int a[nmax], d[nmax * 4];
int n, m;

void build(int st, int dr, int v);
int  maxx(int v, int st, int dt, int str, int drr);
void update(int v, int poz, int val, int st, int dr);
int main()
{
    in >> n >> m ;
    for ( int i = 1; i <= n; ++i )
        in >> a[i];
    build(1, n, 1);
    for ( int i = 1; i <= m; ++i )
    {
        int cr, st, dr;
        in >> cr >> st >> dr;
        if ( cr == 0 )
            out << maxx(1, 1, n, st, dr) << "\n";
        else update(1, st, dr, 1, n);
    }
    return 0;
}

void build(int st, int dr, int v)
{
    if ( st == dr )
    {
        d[v] = a[st];
    }
    else
    {
        int mij = ( st + dr)/2;
        build(st, mij, v * 2);
        build(mij + 1, dr, v * 2 + 1);
        d[v] = max(d[v * 2], d[v * 2 + 1]);
    }
}

int maxx(int v, int st, int dr, int str, int drr)
{
    int rez = 0;
    if ( str > drr )
        return 0;
    if ( st == str and dr == drr )
        return d[v];
    int mij = ( st + dr ) / 2;
    rez = std::max( maxx(v * 2, st, mij, str, min(drr, mij)), maxx(v * 2 + 1, mij + 1, dr, max(mij + 1, str), drr));
    return rez;
}

void update(int v, int poz, int val, int st, int dr)
{
    if ( st == dr )
        d[v] = val;
    else
    {
        int mij = ( st + dr ) / 2;
        if ( poz <= mij )
            update(v * 2, poz, val, st, mij);
        else update( v * 2 + 1, poz, val, mij + 1, dr);
        d[v] = max(d[v * 2], d[v * 2 + 1]);
    }
}