Cod sursa(job #950767)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 17 mai 2013 19:00:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <fstream>

using namespace std;

#define marime 262144
#define marime_v 100002

struct nod
{
   int st,dr,max;       
}arbore[marime];

int maxim(int x,int y)
{
   if(x>y)
     return x;
   return y;    
}

int v[marime_v];

void build(int st,int dr,int poz)
{
   arbore[poz].st=st;
   arbore[poz].dr=dr;  
   if(st==dr)
   {
      arbore[poz].max=v[st];                                
   }     
   else
   {
      int mijl=(st+dr)>>1;
      build(st,mijl,poz<<1);
      build(mijl+1,dr,(poz<<1)+1);
      arbore[poz].max=maxim(arbore[poz<<1].max,arbore[(poz<<1)+1].max);   
   }
}

int query(int st,int dr,int poz)
{
   if(arbore[poz].st==st && arbore[poz].dr==dr)
      return arbore[poz].max;        
   else
   {
      int mijl=(arbore[poz].st+arbore[poz].dr)>>1;
      
      if(st>mijl)
        return query(st,dr,(poz<<1)+1);
      else if(dr<=mijl)
        return query(st,dr,poz<<1);
      else
        return maxim(query(st,mijl,poz<<1),query(mijl+1,dr,(poz<<1)+1));    
   }
}

void update(int unde,int val,int poz)
{
  if(arbore[poz].st==arbore[poz].dr && arbore[poz].st==unde)
     v[unde]=val,arbore[poz].max=v[unde];
  else
  {
     int mijl=(arbore[poz].st+arbore[poz].dr)>>1; 
     if(unde<=mijl)
       update(unde,val,poz<<1);
     else
       update(unde,val,(poz<<1)+1);    
     arbore[poz].max=maxim(arbore[poz<<1].max,arbore[(poz<<1)+1].max);
  }     
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    
    int n,m,i;
    cin>>n>>m;
    for(i=1;i<=n;i++)
      cin>>v[i];
     build(1,n,1);
    int cod,a,b;  
    for(i=0;i<m;i++)
    {
        cin>>cod>>a>>b;
        if(cod==0)
          cout<<query(a,b,1)<<'\n';
        else
          update(a,b,1);             
    }
    
    cin.close();
    cout.close();
    //system("PAUSE");
    return 0;
}