Cod sursa(job #410468)

Utilizator ZillaMathe Bogdan Zilla Data 4 martie 2010 13:42:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>

#define Nmax 100100

int n,m,arb[Nmax*3],max;

void up(int st,int dr,int x,int y,int pas)
{
    if(st==dr)
        arb[pas]=y;
    else
        {
            if(x<=(st+dr)/2)
                up(st,(st+dr)/2,x,y,pas*2);
            else
                if(x>(st+dr)/2)
                    up((st+dr)/2+1,dr,x,y,pas*2+1);
            arb[pas]=arb[pas*2];
            if(arb[pas*2+1]>arb[pas])
                arb[pas]=arb[pas*2+1];
        }
}

void q(int st,int dr,int x,int y,int pas)
{
    if(x<=st && y>=dr)
        {
            if(arb[pas]>max)
                max=arb[pas];
        }
    else
        {
            if(x<=(st+dr)/2)
                q(st,(st+dr)/2,x,y,pas*2);
            if(y>(st+dr)/2)
                q((st+dr)/2+1,dr,x,y,pas*2+1);
        }
}

int main()
{
    int i,x,y,op;

    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;++i)
        {
            scanf("%d",&x);
            up(1,n,i,x,1);
        }

    for(i=1;i<=m;++i)
        {
            scanf("%d%d%d",&op,&x,&y);
            if(op==1)
                up(1,n,x,y,1);
            else
                {
                    max=0;
                    q(1,n,x,y,1);
                    printf("%d\n",max);
                }
        }

    return 0;
}