Cod sursa(job #365416)

Utilizator freak93Adrian Budau freak93 Data 18 noiembrie 2009 17:30:57
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>

using namespace std;

const char iname[]="arbint.in";
const char oname[]="arbint.out";
const int maxn=200005;

int arb[maxn*2],i,n,t,x,y,lg,m;

ifstream f(iname);
ofstream g(oname);

void update(int nod,int left,int right,int pos,int value)
{
    if(left==right)
    {
        arb[nod]=value;
        return;
    }

    int div=(left+right)>>1;
    if(pos<=div)
        update(nod<<1,left,div,pos,value);
    else
        update((nod<<1)+1,div+1,right,pos,value);
    arb[nod]=max(arb[nod<<1],arb[(nod<<1)+1]);
}

int query(int nod,int left,int right,int start,int finish)
{
    if(start<=left&&right<=finish)
    {
        return arb[nod];
    }

    int k=-0x3f3f3f3f;
    int div=(left+right)>>1;
    if(start<=div)
        k=max(k,query(nod<<1,left,div,start,finish));
    if(div<finish)
        k=max(k,query((nod<<1)+1,div+1,right,start,finish));
    return k;
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
    {
        f>>x;
        update(1,1,n,i,x);
    }

    for(i=1;i<=m;++i)
    {
        f>>t>>x>>y;
        if(t==1)
            update(1,1,n,x,y);
        else
            g<<query(1,1,n,x,y)<<"\n";
    }

    f.close();
    g.close();

    return 0;
}