Cod sursa(job #512782)

Utilizator mraresMardare Rares mrares Data 14 decembrie 2010 16:24:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#define nmax 100000001
// define MAXIM(a, b) (a)>(b)?(a):(b)

using namespace std;

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

int x, poz, inc, sf, n, m, maxim;
int v[nmax];

int MAXIM(int a, int b)
{
    if(a>b)
        return a;
    return b;
}

void update(int nod, int ls, int ld)
{
    if(ls == ld)
    {
        v[nod] = x;
        return;
    }

    int m = (ls+ld)/2;
    if(poz <= m)
        update(2*nod, ls, m);
    else
        update(2*nod+1, m+1, ld);

    v[nod] = MAXIM(v[2*nod], v[2*nod+1]);
}

void query(int nod, int ls, int ld)
{
    if(inc <= ls && ld <= sf)
    {
        if(maxim < v[nod])
            maxim = v[nod];
        return;
    }

    int m = (ls+ld)/2;
    if(inc <= m)
        query(2*nod, ls, m);
    if(m < sf)
        query(2*nod+1, m+1, ld);
}

int main()
{
    int i, a, b;
    fin >> n >> m;
    for(i=1; i<=n; ++i)
    {
        fin >> x;
        poz = i;
        update(1, 1, n);
    }
    for(i=1; i<=m; ++i)
    {
        fin >> x;
        if(!x)
        {
            fin >> a >> b;
            maxim = -1;
            inc = a;
            sf = b;
            // poz = i;
            query(1, 1, n);
            fout << maxim << "\n";
        }
        else
        {
            fin >> a >> b;
            poz = a;
            x = b;
            update(1, 1, n);
        }
    }
    return 0;
}