Cod sursa(job #752616)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 28 mai 2012 23:28:00
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <fstream>
#define LE 320
#include <cmath>
#define inf 1<<30
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,i,j,V[LE*LE],a,b,A[LE][LE],Maxim[LE],L,tip;
int update(int poz,int b)
{
  int pozK=poz/L;
  Maxim[pozK]=-inf;
  A[pozK][poz%L+1]=b;
  V[poz]=b;

  for(j=1; j<=L+3; ++j)
    if(A[pozK][j]>Maxim[pozK])
    Maxim[pozK]=A[pozK][j];
}
int query(int lo,int hi)
{
  int rez=-inf;

  while (lo<=hi)
    if (!lo%L&&lo+L<=hi)
      {
        rez=max(rez,Maxim[lo/L]);
        lo+=L;
      }
    else rez=max(rez,V[lo++]);
  return rez;
}
int main()
{
  f>>n>>m;
 L=sqrt(n)+1;

  for(i=1; i<=n; ++i)
    {
      f>>V[i];
      A[i/L][i%L+1]=b;
    }


  for(i=1; i<=m; ++i)
    {
      f>>tip>>a>>b;
      if (!tip)g<<query(a,b)<<'\n';
      else update(a,b);
    }


  f.close();
  g.close();
  return 0;
}