Cod sursa(job #2903978)

Utilizator RaduIonescuRadu Ionescu RaduIonescu Data 17 mai 2022 21:47:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

using namespace std;

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

int arb_rmq[400004], n, m, a, b, x;
bool op_code;

inline int interogare(int n, int st, int dr, int x, int y)
{
    int st_aux, dr_aux;

    dr_aux = st_aux = -1000003;

    if (st>=x && dr<=y) return arb_rmq[n];

    int mij = (st+dr)>>1;

    if (x <= mij)   st_aux = interogare(n<<1, st, mij, x, y);

    if (y > mij)    dr_aux = interogare(n*2+1, mij+1, dr, x, y);

    return max(dr_aux, st_aux);
}

inline void modificare(int n, int st, int dr, int p, int val)
{
    if (st == dr)
    {
        arb_rmq[n] = val;
        return;
    }

    int mij =(st+dr)>>1;

    if (p <= mij)   modificare(n<<1, st, mij, p, val);

    else modificare(n*2+1, mij+1, dr, p, val);

    arb_rmq[n] = max(arb_rmq[n<<1], arb_rmq[n*2+1]);
}

int main()
{
    in>>n>>m;

    for (int i = 1; i <= n; ++i)
    {
        in>>x;
        modificare(1, 1, n, i, x);
    }

    for (int i = 0; i < m; ++i)
    {
        in>>op_code>>a>>b;

        if (op_code == 0)   out<<interogare(1, 1, n, a, b)<<"\n";

        else    modificare(1, 1, n, a, b);
    }

    return 0;
}