Cod sursa(job #270190)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 3 martie 2009 20:07:51
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
// solutie O((m+n)*sqrt(n))
#include<stdio.h>
#include<cmath>
#include<string>
using namespace std;

FILE*fin=fopen("ai.in","r");
FILE*fout=fopen("ai.out","w");
#define nm 100005 
int n,m,a[nm],dim,k,aa[1000];
inline void update(int x,int y)
{
  int bloc,st,dr,i,max=0;
  if(x%k) bloc=x/k+1;
  else bloc=x/k;
  a[x]=y;
  st=(bloc-1)*k+1;
  dr=bloc*k;
  if(bloc==dim) dr=n;
  for(i=st;i<=dr;i++)
    if(a[i]>max) max=a[i];
  aa[bloc]=max;  
}
int query(int x,int y)
{
   int blocx,blocy,ans=0,i,st,dr;
   if(x%k) blocx=x/k+1;
   else blocx=x/k; 
   if(y%k) blocy=y/k+1;
   else blocy=y/k;  
   for(i=blocx+1;i<blocy;i++)
     if(aa[i]>ans) ans=aa[i];
   if(blocx==blocy)
   {
     for(i=x;i<=y;i++)
       if(a[i]>ans) ans=a[i];
   }   
   else 
   {
      st=x;
      dr=blocx*k;
      if(blocx==dim) dr=n;  
      for(i=st;i<=dr;i++) 
        if(a[i]>ans) ans=a[i];
      st=(blocy-1)*k+1;
      dr=y;
      for(i=st;i<=dr;i++) 
        if(a[i]>ans) ans=a[i];     
   }
   return ans;  
}
int main()
{
    int x,y,i,o;
    fscanf(fin,"%d%d",&n,&m);
    for(i=1;i<=n;i++)
      fscanf(fin,"%d",&a[i]);
    k=(int)sqrt(n);
    if(n-k*k) dim=k+1;
    else dim=k;  
    memset(aa,0,sizeof(aa));
    for(i=1;i<=n;i++)
      update(i,a[i]);
    for(i=1;i<=m;i++)
    {
      fscanf(fin,"%d%d%d",&o,&x,&y);
      if(o) update(x,y);
      else fprintf(fout,"%d\n",query(x,y));
    }  
    fclose(fin);
    fclose(fout);
    return 0;
}