Cod sursa(job #212612)

Utilizator Mishu91Andrei Misarca Mishu91 Data 5 octombrie 2008 21:55:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>

#define dim 100001

int N,M,X,V,P;
int rez, st, f;
int S[4*dim + 66];

inline int max(int a, int b)
{
    return (a > b) ? a : b;
}

void update(int nod, int li, int lf)
{
    if(li == lf)
    {
        S[nod] = V;
        return;
    }

    int mij = (li + lf) >> 1;
    if(P <= mij) update(2*nod, li, mij);
    else         update(2*nod + 1, mij + 1, lf);
    S[nod] = max(S[2*nod], S[2*nod + 1]);
}

void querry(int nod, int li, int lf)
{
    if(st <= li && f >= lf)
    {
        if(rez < S[nod]) rez = S[nod];
        return;
    }
    int mij = (li + lf) >> 1;
    if(st <= mij)  querry(2*nod,li,mij);
    if(mij < f)    querry(2*nod + 1,mij+1,lf);
}

void citire()
{
    scanf("%d %d",&N,&M);
    for(int i = 1; i <= N; ++i)
    {
        scanf("%d",&X);
        P = i, V = X;
        update(1,1,N);
    }
}

void solve()
{
    int A,B,C;
    for(int i = 1; i <= M; ++i)
    {
        scanf("%d %d %d",&A,&B,&C);
        if(A == 0)
        {
            rez = -1;
            st = B, f = C;
            querry(1,1,N);
            printf("%d\n",rez);
        }
        else
        {
            P = B, V = C;
            update(1,1,N);
        }
    }
}

int main()
{
    freopen("arbint.in","rt",stdin);
    freopen("arbint.out","wt",stdout);
    citire();
    solve();
}