Cod sursa(job #642006)

Utilizator rootsroots1 roots Data 30 noiembrie 2011 12:29:21
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>

#define TSize 262145

using namespace std;

ifstream in;
ofstream out;

int T[TSize];
int pos,val;
int a,b;
int sol;

inline void update(int nod,int L,int R)
{
    if(L==pos&&pos==R)
    {
        T[nod]=val;
        return;
    }

    int M=(L+R)>>1;

    if(pos<=M) update(nod<<1,L,M);
    else update((nod<<1)+1,M+1,R);

    T[nod]=T[(nod<<1)+1];
    if(T[nod]<T[nod<<1]) T[nod]=T[nod<<1];
}

inline void query(int nod,int L,int R)
{
    if(a<=L&&R<=b)
    {
        if(sol<T[nod]) sol=T[nod];
        return;
    }

    int M=(L+R)>>1;

    if(a<=M) query(nod<<1,L,M);
    if(b>M) query((nod<<1)+1,M+1,R);
}

int main()
{
    int M,N,x;

    in.open("arbint.in");

    in>>N>>M;
    for(pos=1;pos<=N;++pos)
    {
        in>>val;
        update(1,1,N);
    }

    out.open("arbint.out");

    for(;M--;)
    {
        in>>x;
        if(x)
        {
            in>>pos>>val;
            update(1,1,N);
        }
        else
        {
            in>>a>>b;
            sol=0;
            query(1,1,N);
            out<<sol<<'\n';
        }
    }

    in.close();
    out.close();
}