Cod sursa(job #233708)

Utilizator FlorianFlorian Marcu Florian Data 18 decembrie 2008 22:58:19
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>
#define NMAX 100002
#define Log 18
FILE*f=fopen("rmq.in","r");
FILE*g=fopen("rmq.out","w");
int m[Log][NMAX];
int a[NMAX];
int N;
int t;
int lg[NMAX];
void read()
 {
 fscanf(f,"%d %d",&N,&t);
 int i;
 for(i=0;i<N;++i) fscanf(f,"%d",&a[i]);
 lg[1]=0;
 for(i=2;i<=N;++i)  lg[i]=lg[i/2]+1;
 }
void dinamic()
 {
 int i,j;
 for(i=0;i<N;++i)
  m[0][i]=a[i];
 for( j=1; (1<<j) < N; ++j )
  for( i=0; i + (1<<j)-1 < N; ++i)
    {
    if(m[j-1][i] <= m[j-1][i+ (1<<(j-1))])

     m[j][i]=m[j-1][i];

    else
    
     m[j][i]=m[j-1][i+(1<<(j-1))];
     
//    fprintf(g,"poz - %d ; lung - %d ma- %d\n",i,1<<j,m[j][i]);
    }
 }
inline int rmq(int i, int j)
 {
 int k;
 k=lg[j-i+1];
 if(m[k][i] <= m[k][j-(1<<k)+1]) return m[k][i];
 return m[k][j-(1<<k)+1];
 }
int main()
 {
 read();
 dinamic();
 int x,y;
 while(t--)
  {
  fscanf(f,"%d %d",&x,&y);
  fprintf(g,"%d\n",rmq(x-1,y-1));
  }
 return 0;
 }