Cod sursa(job #2493428)

Utilizator hurjui12AlexandruHurjui Alexandru-Mihai hurjui12Alexandru Data 16 noiembrie 2019 12:14:54
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
using namespace std;

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

int arb[1<<17];

void updateEl(int nod, int poz, int val, int st, int dr)
{
    if (st == dr)
        arb[nod] = val;
    else
    {
        int mij = (st+dr)>>1;
        if (poz <= mij)
            updateEl(nod<<1, poz, val, st, mij);
        else
            updateEl(nod<<1|1, poz, val, mij+1, dr);
        arb[nod] = max(arb[nod<<1], arb[nod<<1|1]);
    }
}

int query(int nod, int a, int b, int st, int dr) //avem query ot intervalul [a, b]
{
    int apel1 = 0, apel2 = 0;
    if (a <= st && dr <= b)
        return arb[nod];
    else
    {
        int mij = (st+dr)>>1;
        if (a <= mij)
            apel1 = query(nod<<1, a, b, st, mij);
        if (b > mij)
            apel2 = query(nod<<1|1, a, b, mij+1, dr);
        return max(apel1, apel2);
    }
}

int main()
{
    int n, i, x, m, t, y;
    fin >> n >> m;
    for (i = 1; i<=n; i++)
    {
        fin >> x;
        updateEl(1, i, x, 1, n);
    }
    for (i = 1; i<=m; i++)
    {
        fin >> t >> x >> y;
        if (t == 0)
            fout << query(1, x, y, 1, n) << '\n';
        else
            updateEl(1, x, y, 1, n);
    }
    return 0;
}