Cod sursa(job #832286)

Utilizator energystarEnergyStar energystar Data 10 decembrie 2012 11:56:55
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 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 = 225000;

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;
}

inline int isLeft(int nod)
{
    if((nod << 1) <= KMAX)
        return 1;
    return 0;
}

inline int isRight(int nod)
{
    if((nod << 1) + 1 <= KMAX)
        return 1;
    return 0;
}

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

        if(isLeft(nod))
            A[nod] = A[nod << 1];
        if(isRight(nod))
            A[nod] = maxim(A[nod], 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 && isLeft(nod))
            Query(nod << 1, left, m);
        if(m < v && isRight(nod))
            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;
}