Cod sursa(job #1143145)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 14 martie 2014 20:28:22
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<cstdio>
const int MAX_N=100000,LOG2_MAX_N=18;
int rmq[LOG2_MAX_N][MAX_N];
int log2[MAX_N];
int n,m;
void read(){
    int i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%d",&rmq[0][i]);
}
void setLog2(){
    int i;
    for(i=2;i<=n;i++)
        log2[i]=log2[i/2]+1;
}
int min2(int x,int y){
    if (x<y)
        y=x;
    return y;
}
void setRmq(){
    int i,j;
    for(i=1;(1<<i)<=n;i++)
        for(j=1;j<=n-(1<<i)+1;j++)
            rmq[i][j] = min2(rmq[i-1][j],rmq[i-1][(j+(1<<(i-1)))]);
}
void init(){
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    read();
    setLog2();
    setRmq();
}
int main(){
    int x,y;
    init();
    while(m>0){
        m--;
        scanf("%d%d",&x,&y);
        printf("%d\n",min2(rmq[log2[y-x+1]][x],rmq[log2[y-x+1]][y-(1<<(log2[y-x+1]))+1]));
    }
    return 0;
}