Cod sursa(job #1379058)

Utilizator Ionut228Ionut Calofir Ionut228 Data 6 martie 2015 16:02:30
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int N, M;
int a, b, type, maxim;
int AINT[1 << 18];

void query(int nod, int lt, int rt, int start, int finish)
{
    if (start <= lt && rt <= finish)
    {
        maxim = max(AINT[nod], maxim);
        return;
    }
    if (lt == rt)
        return;

    int mid = (lt + rt) >> 1;

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

void update(int nod, int lt, int rt, int pos, int x)
{
    if (lt == rt)
    {
        AINT[nod] = x;
        return;
    }

    int mid = (lt + rt) / 2;

    if (pos <= mid)
        update(nod * 2, lt, mid, pos, x);
    else
        update(nod * 2 + 1, mid + 1, rt, pos, x);

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

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

    for (int i = 1; i <= M; ++i)
    {
        fin >> type >> a >> b;
        if (type == 0)
        {
            maxim = 0;
            query(1, 1, N, a, b);
            fout << maxim << '\n';
        }
        else
            update(1, 1, N, a, b);
    }

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