Cod sursa(job #280851)

Utilizator igsifvevc avb igsi Data 13 martie 2009 16:52:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<fstream.h>

#define xx 100001

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,poz,val,max,h[5*xx],a,b;

void creare_arb(int,int,int);
void interogare(int,int,int);

int main()
{
    int i,t,op;
    fin>>n>>t;
    for(i=1;i<=n;i++)
    {
      fin>>val;
      poz=i;
      creare_arb(1,1,n);
    }
    
    for(i=1;i<=t;i++)
    {
      fin>>op>>a>>b;
      if(op)
      {
            poz=a;
            val=b;
            creare_arb(1,1,n);
      }
      else
      {
          max=0;
          interogare(1,1,n);
          fout<<max<<'\n';
      }
    }
    
    fout.close();
    return 0;
}

void interogare(int nd,int li,int ls)
{
     if(a<=li && ls<=b)
     {
       max=(max<h[nd] ? h[nd] : max);
       return ;
     }
     
     int mij=(li+ls)/2;
     
     if(a<=mij)
       interogare(2*nd,li,mij);
     if(mij<b)
       interogare(2*nd+1,mij+1,ls);
}

void creare_arb(int nd,int li,int ls)
{
     if(li==ls)
     {
       h[nd]=val;
       return ;
     }
     
     int mij=(li+ls)/2;
     
     if(poz<=mij)
        creare_arb(2*nd,li,mij);
     else
        creare_arb(2*nd+1,mij+1,ls);
     
     h[nd]=(h[2*nd]>h[2*nd+1] ? h[2*nd] : h[2*nd+1]);
}