Cod sursa(job #218603)

Utilizator katakunaCazacu Alexandru katakuna Data 2 noiembrie 2008 19:07:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
int v[100111],a[18][100111];
int d,p,u,i,j,n,m,lg[100111];

int main(){

FILE *f=fopen("rmq.in","r");
FILE *g=fopen("rmq.out","w");

fscanf(f,"%d %d",&n,&m);

  for(i=1;i<=n;i++)
  fscanf(f,"%d ",&v[i]);

j=2;
int q=0;

  for(i=1;i<=n;i++){
     if(i==j){
     q++;
     lg[i]=q;
     j=j<<1;
     }

  lg[i]=q;
  }

int N=lg[n];

  for(i=1;i<=n;i++)
  a[0][i]=v[i];

    for(i=1;i<=N;i++){
       for(j=1;j+(1<<(i)) -1 <=n;j++){
       a[i][j]=a[i-1][j];

         if(a[i][j] > a[i-1][j+(1<<(i-1))])
         a[i][j] = a[i-1][j+(1<<(i-1))];

       }
    }

  for(i=1;i<=m;i++){
  fscanf(f,"%d %d",&p,&u);
    d=u-p;
  fprintf(g,"%d\n",min( a[lg[d]][p] , a[ lg[d] ][u-(1<<lg[d]) + 1]  ));
  }

fclose(f);
fclose(g);

return 0;
}