Cod sursa(job #283953)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 20 martie 2009 20:50:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <stdio.h>      
  
#define NMAX 401000   
  
int n,m;   
int arbore[NMAX];   
int v,p,maxim,f,s;   
  
int max(int a,int b)   
{   
if (a>b) return a;   
   else  return b;   
}   
  
void interogare(int nod,int st,int dr)   
{   
int mij;   
if (st==dr)   
{   
arbore[nod]=v;   
return;   
}   
mij=(st+dr)/2;   
if (p<=mij) interogare(2*nod,st,mij);   
     else     interogare(2*nod+1,mij+1,dr);   
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);   
}   
  
  
void actualizare(int nod,int st,int dr)   
{   
int mij;   
if (s<=st && dr<=f)   
{   
if (maxim<arbore[nod])   
   maxim=arbore[nod];   
return;   
}   
mij=(st+dr)/2;   
if (s<=mij) actualizare(2*nod,st,mij);   
if (mij<f) actualizare(2*nod+1,mij+1,dr);   
}   
  
  
int main()   
{   
int i,a,b,x;   
freopen("arbint.in","r",stdin);   
freopen("arbint.out","w",stdout);   
scanf("%d%d",&n,&m);   
    for (i=1;i<=n;++i){      
        scanf("%d",&x);      
    p=i;   
    v=x;   
    interogare(1,1,n);   
    }      
    while (m--)   
    {   
    scanf("%d%d%d",&x,&a,&b);   
    if (x==0)   
       {   
      maxim=-1;   
      s=a;   
      f=b;   
      actualizare(1,1,n);   
      printf("%d\n",maxim);   
      }   
      else  
      {   
           p=a;   
           v=b;   
           interogare(1,1,n);   
      }   
    }   
return 0;   
}