Cod sursa(job #856296)

Utilizator IoannaPandele Ioana Ioanna Data 16 ianuarie 2013 10:40:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include<fstream>
#include<cmath>
#define NMAX 100002
#define radical 333

using namespace std;

int b[radical],a[NMAX];
int n,m;
int rad;

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

void scan()
{
  in>>n>>m;
  rad=sqrt(n);
  for (int i = 0; i<n;++i)
  {
    in>>a[i];
    if (b[i/rad]<a[i])
      b[i/rad]=a[i];
  }
}

void operatii()
{
  int x,y,z;
  int begin,end;
  int mx;
  for (int i=1;i<=m;++i)
  {
      in>>z>>x>>y;
      if (z==0)
      {
        if ((x-1)%rad==0)
          begin=(x-1)/rad;
        else begin=(x-1)/rad+1;
        if ((y)%rad==0)
          end=(y-1)/rad;
        else end=(y-1)/rad-1;
        mx=0;
        for (int j=begin;j<=end;++j)
          if (b[j]>mx) mx=b[j];
        for (int j=x-1;j<begin*rad;++j)
          if (a[j]>mx) mx=a[j];
        for (int j=(end+1)*rad;j<y;++j)
          if (a[j]>mx) mx=a[j];
        out<<mx<<"\n";
      }
      else
      {
        int k;
        k=(x-1)/rad;
        a[x-1]=y;
        mx=0;
        for (int j=k*rad;j<=(k+1)*rad-1;++j)
        {
          if (a[j]>mx)
            mx=a[j];
        }
        b[k]=mx;
      }
  }
}

int main()
{
  scan();
  operatii();
  return 0;
}