Cod sursa(job #328575)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 2 iulie 2009 15:22:39
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#include<string>

using namespace std;

FILE*fin=fopen("rmq.in","r");
FILE*fout=fopen("rmq.out","w");

#define nm 100005
#define min(a,b)((a)<(b)?(a):(b))

int s[nm],l[nm],rmq[20][nm];

int main()
{
    int n,q,a,b,i,j,cmp2;
    
    fscanf(fin,"%d%d",&n,&q);
    
    for(i=1;i<=n;i++)
      fscanf(fin,"%d",&s[i]);
    
    l[1]=0;
      
    for(i=2;i<=n;i++)  
      l[i]=l[i/2]+1;
      
    for(i=1;i<=n;i++)
      rmq[0][i]=s[i];
    
    for(j=1;(1<<j)<=n;j++)
      for(i=1;i+(1<<j)-1<=n;i++)
        rmq[j][i]=min(rmq[j-1][i],rmq[j-1][i+(1<<(j-1))]);
        
    for(j=1;j<=q;j++)
    {
      fscanf(fin,"%d%d",&a,&b);
      
      cmp2=l[b-a+1];
      
      fprintf(fout,"%d\n",min(rmq[cmp2][a],rmq[cmp2][b-(1<<cmp2)+1]));
    }        
    
      
    fclose(fin);
    fclose(fout);
    
    return 0;
}