Cod sursa(job #2079187)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 30 noiembrie 2017 18:38:13
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#define NMAX 100001
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m, arb[NMAX+NMAX-1], pos, val, maxim, start, finish;

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

int main()
{
    in >> n >> m;
    for(int x, i = 1; i <= n; ++i)
    {
        in >> x;
        pos = i, val = x;
        update(1, 1, n);
    }
    for(int tip, x, y, i = 1; i <= m; ++i)
    {
        in >> tip >> x >> y;
        if(tip)
        {
            pos = x, val = y;
            update(1, 1, n);
        }
        else
        {
            maxim = -1;
            start = x, finish = y;
            query(1, 1, n);

            out << maxim << '\n';
        }
    }
    in.close(), out.close();
    return 0;
}

void update(int nod, int st, int dr)
{
    if(st == dr)
    {
        arb[nod] = val;
        return;
    }

    int m = (st+dr) >> 1;
    if(pos <= m) update((nod<<1), st, m);
    else update((nod<<1) +1, m+1, dr);
    arb[nod] = max(arb[(nod<<1)], arb[(nod<<1) +1]);
}

void query(int nod, int st, int dr)
{
    if(start <= st && dr <= finish)
    {
        maxim = max(maxim, arb[nod]);
        return;
    }

    int m = (st+dr) >> 1;
    if(start <= m) query((nod<<1), st, m);
    if(m < finish) query((nod<<1) +1, m+1, dr);
}