Cod sursa(job #405269)

Utilizator bora_marianBora marian bora_marian Data 27 februarie 2010 20:32:01
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
using namespace std;
int v[600003],m,n,poz,x;
int a,b,maxim;
void cauta(int nod,int st,int dr);
void update(int nod,int st,int dr);
int main()
{
    ifstream fin("arbint.in");
    freopen("arbint.out","w",stdout);
    fin>>n>>m;
    int i;
    for(i=1;i<=n;i++)
    {
      poz=i;
      fin>>x;
      update(1,1,n);
     }
    for(i=1;i<=m;i++)
    {
      int k;
      fin>>k>>a>>b;
      if(k==0)
      {
         maxim=-1;
         cauta(1,1,n);
         printf("%d",maxim);
         printf("\n");
      }
      else
       poz=a,x=b,update(1,1,n);
    }
 return 0;
}
void update(int nod,int st,int dr)
{
   if(st==dr)
   { 
     v[nod]=x;
     return;}
   else
    {
      int mij=(st+dr)/2;
      if(poz<=mij)
        update(2*nod,st,mij);
      else
        update(2*nod+1,mij+1,dr);
      if(v[2*nod]>v[2*nod+1])
         v[nod]=v[2*nod];
      else
         v[nod]=v[2*nod+1];
      }
}
void cauta(int nod,int st,int dr)
{
     if(a<=st && b>=dr)
      { 
       if(maxim<v[nod])
          maxim=v[nod];
        return;
        }
     else
     {
         int mij=(st+dr)/2;
         if(a<=mij)
           cauta(2*nod,st,mij);
         if(b>mij)
           cauta(2*nod+1,mij+1,dr);
      }
}