Cod sursa(job #232436)

Utilizator crawlerPuni Andrei Paul crawler Data 15 decembrie 2008 12:25:43
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <stdio.h>

#define Nmax 200100

int a[2*Nmax], n;
//retin maximul pe interval

void update(int nod,int st,int dr,int poz,int x)
{     
     if (st == dr && st == poz)
     {
        a[nod] = x;
        return;       
     }     
     int mij = (st+dr)/2;
     if (st <= poz && poz <= mij) update(nod*2,st,mij,poz,x);
     if (mij+1 <= poz && poz <= dr) update(nod*2+1,mij+1,dr,poz,x);
     a[nod] = a[2*nod];
     if (a[nod] < a[2*nod+1]) a[nod] = a[2*nod+1];     
}

int q(int nod,int st,int dr,int i,int j)
{    
    if (i<=st && dr<=j) return a[nod];
    int mij=(st+dr)/2,unu=0,doi=0;
    if (i<=mij) unu = q(nod*2,st,mij,i,j);
    if (mij<j)  doi = q(2*nod+1,mij+1,dr,i,j);
    if (unu > doi) return unu;
    return doi;  
}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    
    int m;
    scanf("%d%d",&n,&m);
    int tmp;
    
    for (int i=1;i<=n;++i) 
    {
        scanf("%d",&tmp);
        update(1,1,n,i,tmp);
        
    }        
    int a,b,op;
    
    for (int i=1;i<=m;++i)
    {
        scanf("%d%d%d", &op,&a,&b);
        if (op == 1) update(1,1,n,a,b);
        else printf("%d\n",q(1,1,n,a,b));    
    }   
            
    return 0;    
}