Cod sursa(job #627115)

Utilizator igsifvevc avb igsi Data 29 octombrie 2011 00:18:23
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream>
using namespace std;
#define xx 100001

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

int m,n,arb[5*xx],a,b,maxim,poz,val;

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

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

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