Cod sursa(job #1280301)

Utilizator Ionut228Ionut Calofir Ionut228 Data 1 decembrie 2014 19:15:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int N, M, A, B, maxim;
int ARB[1 << 18];

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

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

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

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

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

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

    for (int i = 1, type; i <= M; ++i)
    {
        fin >> type >> A >> B;

        if (type == 0)
        {
            maxim = 0;
            Question(1, 1, N, A, B);
            fout << maxim << '\n';
        }
        else
            Update(1, 1, N, A, B);
    }

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