Cod sursa(job #328630)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 2 iulie 2009 19:37:58
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 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))
#define maxbuf 65536

int s[nm],l[nm],rmq[20][nm],ind;
char buf[maxbuf];

inline void refbuf()
{
     int ans=fread(buf,1,maxbuf,fin);
     if(ans<maxbuf) buf[ans]=0;
     ind=0;
}

inline int readnr()
{
     int ans=0;   
     one:
         while(ind<maxbuf&&!isdigit(buf[ind])) ind++;
         if(ind==maxbuf)
         {
           refbuf();
           goto one;
         } 
     two:
         while(ind<maxbuf&&isdigit(buf[ind]))
         {
           ans=ans*10+buf[ind]-'0';
           ind++;
         }    
         if(ind==maxbuf)
         {
           refbuf();
           goto two;
         }
     return ans;    
}

int main()
{
    int n,q,a,b,i,j,cmp2;
    
    refbuf();
    
    n=readnr();
    q=readnr();
    
    for(i=1;i<=n;i++)
      s[i]=readnr();
    
    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++)
    {
      a=readnr();
      b=readnr();
      
      cmp2=l[b-a+1];
      
      int rez=min(rmq[cmp2][a],rmq[cmp2][b-(1<<cmp2)+1]);
      
      fprintf(fout,"%d\n",rez);
    }        
    
      
    fclose(fin);
    fclose(fout);
    
    return 0;
}