Cod sursa(job #2624453)

Utilizator SahisttulArsene Marinel Sahisttul Data 4 iunie 2020 20:54:26
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int arb[4 * 100001], maxx;

inline int Maxim(int a, int b)
{
    return (a < b) ? b : a;
}

void Actualizare(int nod, int  st, int dr, int poz, int val)
{
    if(st == dr)
    {
        arb[nod] = val;
        return;
    }
    int m = (st + dr)/2;
    if(poz <= m)
        Actualizare(2 * nod, st, m, poz, val);
    else
        Actualizare(2 * nod + 1, m + 1, dr, poz, val);
    arb[nod] = Maxim(arb[2 * nod], arb[2 * nod + 1]);
}

void Interogare(int nod, int st, int dr, int a, int b)
{
    if(a <= st && dr <= b)
    {
        maxx = Maxim(maxx, arb[nod]);
        return;
    }
    int m = (st + dr)/2;
    if(a <= m)
        Interogare(2 * nod, st, m, a, b);
    if(b > m)
        Interogare(2 * nod + 1, m + 1, dr, a, b);
}

int main()
{
    int N, M;
    f >> N >> M;
    for(int i = 1; i <= N; i++)
    {
        int x;
        f >> x;
        Actualizare(1, 1, N, i, x);
    }
    for(int i = 1; i <= M; i++)
    {
        int op, a, b;
        f >> op >> a >> b;
        if(op == 0)
        {
            maxx = 0;
            Interogare(1, 1, N, a, b);
            g << maxx << '\n';
        }
        else if(op == 1)
            Actualizare(1, 1, N, a, b);
    }
    return 0;
}