Cod sursa(job #1234432)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 27 septembrie 2014 13:30:42
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#define n_max 1000010
#include <algorithm>
#include <cmath>
#define sqmx 318
#define emv 1000000

using namespace std;
int n,m,sqr;
int a[n_max],minsq[sqmx];

void read(){
  int i;
  scanf("%d %d",&n, &m);
  sqr=(int)sqrt(n)-1;
  for(i=1;i<=n;i++)scanf("%d" ,&a[i]);
  for(i=1;i*sqr<=n;i++)
     for(int j=sqr*(i-1)+1;j<=sqr*i;j++)
      if(!minsq[i] || minsq[i] > a[j])
         minsq[i] =a[j];
        
  
}
int main(void){
  freopen("rmq.in","r" ,stdin);
  //freopen("rmq.out", "w" ,stdout );
  read();
  int tg,x,y;
  while(m--){
     tg=emv;
     scanf("%d %d",&x,&y);
     int j;
     for(j=1;j*sqr<x;j++);
     j++;
     int ls=min(y,sqr*(j-1));
     while(j*sqr<=y){
          if(minsq[j]<tg)tg=minsq[j];
          j++;                
      }
     int ld=max(sqr*(j-1),x);  
     for(j=x; j<=ls;j++)
         if(a[j]<tg)tg=a[j];
     for(j=ld;j<=y;j++)
        if(a[j]<tg)tg=a[j];    
     printf("%d\n",tg);
  } 
}