Cod sursa(job #752614)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 28 mai 2012 23:25:51
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 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];
      update(i,V[i]);
    }


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

*/
for(i=1;i<=n;++i) f>>V[i];
int rez;

for(i=1;i<=m;++i)
{
    f>>tip>>a>>b;
    if (!tip==1)
    {
       rez=-inf;

        for(j=a;j<=b;++j)
        rez=max(rez,V[j]);
        g<<rez<<'\n';
    }
    else V[a]=b;
}
  f.close();
  g.close();
  return 0;
}