Cod sursa(job #386246)

Utilizator mihaionlyMihai Jiplea mihaionly Data 24 ianuarie 2010 14:10:19
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
using namespace std;
#define dim 100000
#define nmax 1<<18
inline int maxim(int a,int b)
 {
 if(a>b) return a;
 return b;
 }
int n,m,Arb[nmax],C[dim],Val,Pos,mx,cst,cdr;
ifstream f("arbint.in");
void Query(int nod,int left,int right)
 {
 if(left>=cst && right<=cdr)
  {
  if(Arb[nod]>mx)
   mx=Arb[nod];
  return;
  }
 int middle=(left+right)/2;
 if(cst<=middle)
  Query(2*nod,left,middle);
 if(middle<cdr)
  Query(2*nod+1,middle+1,right);
 }
void Update(int nod,int left,int right)
 {
 if(left==right)
  {
  Arb[nod]=Val;
  return;
  }
 int middle=(left+right)/2;
 if(Pos<=middle)
  Update(2*nod,left,middle);
 else
  Update(2*nod+1,middle+1,right);
 Arb[nod]=maxim(Arb[2*nod],Arb[2*nod+1]);
 }
void read()
 {
 int i;
 f>>n>>m;
 for(i=1;i<=n;++i)
  {
  f>>Val;
  Pos=i;
  Update(1,1,n);
  }
 }
void solve()
 {
 int ok,i,a,b;
 ofstream g("arbint.out");
 for(i=1;i<=m;++i)
  {
  f>>ok>>a>>b;
  if(!ok)
   {
   mx=-1;
   cst=a;
   cdr=b;
   Query(1,1,n);
   g<<mx<<endl;
   }
  else
   {
   Pos=a;
   Val=b;
   Update(1,1,n);
   }
  }
 }
int main()
 {
 read();
 solve();
 return 0;
 }