Cod sursa(job #751519)

Utilizator test1Trying Here test1 Data 26 mai 2012 11:41:14
Problema Range minimum query Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define TEST 0

int c[100001][19],n,m;

void open(){
    if(TEST)
    {
        freopen("test.in","r",stdin);
        freopen("test.out","w",stdout);
    } else {
        freopen("rmq.in","r",stdin);
        freopen("rmq.out","w",stdout);
    }
}

void RMQ(){
    for(int j=1;(1<<j)<=n;j++)
    for(int i=0;i+(1<<(j-1))<n;i++)
    c[i][j]=min(c[i][j-1],c[i+(1<<(j-1))][j-1]);
}

int main(){
    int x,y,k;
    open();

    scanf("%d %d",&n,&m);

    for(int i=0;i<n;i++)scanf("%d",&c[i][0]);
    RMQ();
  //  for(int i=0;i<n;i++){
  //  for(int j=0;j<10;j++)printf("%d ",c[i][j]); printf("\n"); }
    for(int i=0;i<m;i++)
    {
        scanf("%d %d",&x,&y);
        // query
        k=(long double)(log10(y-x))/(long double)(log10(2));
        printf("%d\n",min(c[x-1][k],c[y-(1<<k)][k]));
    }
    return 0;
}