Cod sursa(job #968018)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 29 iunie 2013 15:21:26
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,st[400],dr[400],mx[400],a[100005],buc[100005],k;
void Read(); void Solve(); void Update(int x); void Query(int x,int y);
void Read()
{ int i,j,max1=0;
  f>>n>>m;
   for(i=1;i<=n;i++) f>>a[i];
  k=1;
   while(k*k<=n) k++;
  k--;

   for(i=1;i<=k;i++)
    {st[i]=dr[i-1]+1; dr[i]=st[i]+k-1;
     max1=-1;
      for(j=st[i];j<=dr[i];j++)
       {if (a[j]>max1) max1=a[j];
       buc[j]=i;
       }
     mx[i]=max1;
    // cout<<st[i]<<" "<<dr[i]<<" "<<mx[i]<<"\n";
     }
}
void Solve()
{ int i,t,b,e;
  for(i=1;i<=m;i++)
  { f>>t;
    if (!t) {f>>b>>e; Query(b,e); }
     else {f>>b>>e; a[b]=e; Update(b); }
  }
}
void Update(int x)
{ int i,v,max2;
  v=buc[x];
  if (!buc[x]) return;
  max2=-1;
  for(i=st[v];i<=dr[v];i++)
    if (a[i]>max2) max2=a[i];
  mx[v]=max2;
}
void Query(int x,int y)
{ int max3=-1,i;
    //cout<<mx[2]<<" "<<y<<" "<<st[buc[y]]<<" "<<dr[buc[y]]<<"\n";
    for(i=x;i<=y;)
    if (!buc[i] || !(st[buc[i]]>=x && dr[buc[i]]<=y))
      {if (a[i]>max3) max3=a[i];
       i++;}
     else
     { if (mx[buc[i]]>max3) max3=mx[buc[i]];
       i=dr[buc[i]]+1; }

g<<max3<<"\n";
}
int main()
{ Read();
  Solve();
    return 0;
}