Cod sursa(job #204346)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 23 august 2008 02:48:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
long x[17][100000];
long log2[100001];

long min(long a,long b)
{long m,p;
 m=x[log2[b-a+1]][a-1];
 p=x[log2[b-a+1]][b-(1<<log2[b-a+1])];
 if(m<p)return m;
 else return p;
}

int main ()
{FILE *fin=fopen("rmq.in","r");
 FILE *fout=fopen("rmq.out","w");
 long m,n,a,b,i,j,k;
 fscanf(fin,"%ld%ld",&n,&m);

 for (i=0;i<n;i++)
 {fscanf(fin,"%ld",&x[0][i]);}

 for (j=1;n>>j;j++)
 {for (i=0;(i+(1<<j))<=n;i++)
  {if(x[j-1][i]>x[j-1][i+(1<<(j-1))])
   {x[j][i]=x[j-1][i+(1<<(j-1))];}
   else
   {x[j][i]=x[j-1][i];}
  }
 }
 for (i=0;n>>i;i++)
 {k=1<<i;
  for (j=k;j<2*k&&j<=n;j++)
  {log2[j]=i;
  }
 }//i=0,k=1

 for (i=1;i<=m;i++)
 {fscanf(fin,"%ld%ld",&a,&b);
  fprintf(fout,"%ld\n",min(a,b));
 }
 
 
 fclose(fout);
 return (0);
}