Cod sursa(job #554228)

Utilizator DanceKrissCristian Oancea DanceKriss Data 14 martie 2011 18:06:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include<stdio.h>
#define NMAX 100010
using namespace std;
int arb[5*NMAX],n,m,
    li,ls,val,poz,cat;
void update( int nod, int st, int dr )
{
    if( st==dr )
        {
            arb[nod] = val;
            return ;
        }
    int mid = (dr+st)/2;
    if(poz<=mid) update( 2*nod,st,mid);
        else   update( 2*nod+1,mid+1,dr );
    arb[nod] = (arb[2*nod]>arb[2*nod+1]) ? arb[2*nod] : arb[2*nod+1];
}
void quest( int nod, int st, int dr )
{
    if( li<=st && ls>=dr )
        {
            cat = ( cat<arb[nod] ) ? arb[nod] : cat;
            return ;
        }
    int mid = (dr+st)/2;
    if(li<=mid) quest( 2*nod,st,mid);
    if(ls>mid) quest(2*nod+1,mid+1,dr);
}
void read()
{
    int i,x;
    scanf("%d%d",&n,&m);
    for( i=1; i<=n; i++ )
        {
            scanf("%d",&x);
            poz=i;val=x;
            update(1,1,n);
        }
}
void solve()
{
    int i,op,a,b;
    for( i=1; i<=m; i++ )
        {
            scanf("%d%d%d",&op,&a,&b);
            if(op)
            {
                poz = a; val = b;
                update(1,1,n);
            }
            if(op==0)
            {
                cat = -1;
                li = a; ls = b;
                if(a>b) li=b,ls=a;
                quest(1,1,n);
                printf("%d\n",cat);
            }
        }
}
int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    read();
    solve();
    return 0;
}