Cod sursa(job #433874)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 4 aprilie 2010 16:36:28
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<algorithm>
using namespace std;

#define DIM 100005

int a[3*DIM],n,m,sol;

void insert (int nr,int poz,int st,int dr,int k)
{
    if(st==dr)
    {
        a[k]=nr;
        return ;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        insert (nr,poz,st,mij,2*k);
    else
        insert (nr,poz,mij+1,dr,2*k+1);
    a[k]=max(a[2*k],a[2*k+1]);
}
void show (int x,int y,int st,int dr,int k)
{
    int mij=(st+dr)/2;
    if((st==x && y==dr) || st==dr)
    {
        sol=max(sol,a[k]);
        return ;
    }
    else
    {
        if(x<=mij)
            show (x,y,st,mij,2*k);
        if(y>mij)
            show (x,y,mij+1,dr,2*k+1);
    }
}
int main ()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int i,q,x,y,nr;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&nr);
        insert (nr,i,1,n,1);
    }
    for(i=1;i<=m;++i)
    {
        scanf ("%d%d%d",&q,&x,&y);
        if(q==0)
        {
            sol=-1;
            show (x,y,1,n,1);
            printf("%d\n",sol);
        }
        else
            insert (y,x,1,n,1);
    }
    return 0;
}