Cod sursa(job #832294)

Utilizator energystarEnergyStar energystar Data 10 decembrie 2012 12:03:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>

using namespace std;

const char IN[] = "arbint.in";
const char OUT[] = "arbint.out";

ifstream fin(IN);
ofstream fout(OUT);

const int KMAX = 262150;

int A[KMAX];
int N, M;
int u, v, qmax, val, pos;

inline int maxim(int p, int q)
{
    if(p > q)
        return p;
    return q;
}

void Update(int nod, int left, int right)
{
    if(left == right)
        A[nod] = val;
    else
    {
        int m = (left + right) >> 1;
        if(pos <= m)
            Update(nod << 1, left, m);
        if(pos > m)
            Update((nod << 1) + 1, m + 1, right);

        A[nod] = maxim(A[nod << 1], A[(nod << 1) + 1]);
    }
}

void Query(int nod, int left, int right)
{
    if(u <= left && right <= v)
        if(qmax < A[nod])
            qmax = A[nod];
        else;
    else
    {
        int m = (left + right) >> 1;
        if(u <= m)
            Query(nod << 1, left, m);
        if(m < v)
            Query((nod << 1) + 1, m + 1, right);
    }
}

int main()
{
    int i, c;
    fin >> N >> M;
    for(i = 1; i <= N; ++i)
    {
        fin >> val;
        pos = i;
        Update(1, 1, N);
    }
    for(i = 1; i <= M; ++i)
    {
        fin >> c >> u >> v;
        if(!c)
        {
            qmax = -1;
            Query(1, 1, N);
            fout << qmax << '\n';
        }
        else
        {
            pos = u;
            val = v;
            Update(1, 1, N);
        }
    }
    return 0;
}