Cod sursa(job #650248)

Utilizator emy_0o7Grigore Emil emy_0o7 Data 17 decembrie 2011 18:05:03
Problema Range minimum query Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 0.79 kb
#include<stdio.h>
int minim(int a,int b)
{
 if(a<b)
  return a;
  return b;
}

int v[10005][20];
int lg[100005];
int constructie(int n,FILE *fin)
{
 int i,k=1,j;
 for(i=1;i<=n;i++)
  fscanf(fin,"%d",&v[0][i]);
  for(i=1;(1<<i)<=n;i++)
   for(j=1;j<=n-(1<<i)+1;j++)
   {
    v[i][j]=minim(v[i-1][j],v[i-1][j+(1<<i-1)]);
   }
   
}
int logaritm(int n)
{
 int i;
 lg[1]=0;
 for(i=2;i<=n;i++)
  lg[i]=lg[i/2]+1;
}
int main()
{
 FILE *fin,*fout;
 fin=fopen("rmq.in","r");
 fout=fopen("rmq.out","w");
 int x,y,i,k,m,n;
 fscanf(fin,"%d%d",&n,&m);
 constructie(n,fin);
 logaritm(n);
 for(i=1;i<=m;i++)
 {
   fscanf(fin,"%d%d",&x,&y);
   k=lg[y-x+1];
   fprintf(fout,"%d",minim(v[k][x],v[k][y+1-(1<<k)]));
   
 }
   fclose(fout);
   fclose(fin);
}