Cod sursa(job #1141104)

Utilizator Ionut228Ionut Calofir Ionut228 Data 12 martie 2014 16:59:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int N, M;
int maxim;
int ARB[400002];
int start, finish, val, pos;

void Update(int nod, int lt, int rt)
{
    if (lt == rt)
    {
        ARB[nod] = val;
        return;
    }

    int mid = (lt + rt) / 2;
    if (pos <= mid) Update(2 * nod, lt, mid);
    else            Update(2 * nod + 1, mid + 1, rt);

    ARB[nod] = max(ARB[2 * nod], ARB[2 * nod + 1]);
}

void Question(int nod, int lt, int rt)
{
    if (start <= lt && rt <= finish)
    {
        if (ARB[nod] > maxim) maxim = ARB[nod];
        return;
    }
    if (lt == rt) return;

    int mid = (lt + rt) / 2;
    if (start <= mid)  Question(2 * nod, lt, mid);
    if (mid < finish) Question(2 * nod + 1, mid + 1, rt);
}

int main()
{
    fin >> N >> M;
    for (int i = 1, x; i <= N; ++i)
    {
        fin >> x;
        val = x;
        pos = i;
        Update(1, 1, N);
    }

    for (int i = 1, x, A, B; i <= M; ++i)
    {
        fin >> x >> A >> B;
        if (x == 0)
        {
            maxim = -1;
            start = A;
            finish = B;
            Question(1, 1, N);

            fout << maxim << '\n';
        }
        else
        {
            pos = A;
            val = B;
            Update(1, 1, N);
        }
    }

    fin.close();
    fout.close();
    return 0;
}