Cod sursa(job #642318)

Utilizator rootsroots1 roots Data 30 noiembrie 2011 22:50:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <cstring>

#define TSize 262145
#define buffSize 262144

using namespace std;

int sol,ind=0,ok=1;
int T[TSize];

char buff[buffSize];

inline void read(int &x)
{
    if(ok)
    {
        fread(buff,1,buffSize,stdin);
        ind=0;
        ok=0;
    }

    x=0;
    while(buff[ind]<='9'&&buff[ind]>='0'&&ind<buffSize)
    {
        x*=10;
        x+=buff[ind]-'0';
        ++ind;

        if(ind>=buffSize)
        {
            fread(buff,1,buffSize,stdin);
            ind=0;
        }
    }

    while((buff[ind]>'9'||buff[ind]<'0')&&ind<buffSize)
    {
        ++ind;
        if(ind>=buffSize)
        {
            fread(buff,1,buffSize,stdin);
            ind=0;
        }
    }
}

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

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

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

    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,int a,int b)
{
    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,a,b);
    if(b>M) query((nod<<1)+1,M+1,R,a,b);
}

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

    freopen("arbint.in","r",stdin);

    read(N);
    read(M);
    for(int i=1;i<=N;++i)
    {
        read(x);
        update(1,1,N,i,x);
    }

    freopen("arbint.out","w",stdout);

    for(;M--;)
    {
        read(x);
        read(a);
        read(b);
        if(x) update(1,1,N,a,b);
        else
        {
            sol=0;
            query(1,1,N,a,b);

            printf("%d\n",sol);
        }
    }

    return 0;
}