Cod sursa(job #744367)

Utilizator SmarandaMaria Pandele Smaranda Data 8 mai 2012 14:52:34
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
#include <algorithm>
using namespace std;
long l2[100005];
long rmq[32][100005];
int main () {
    long n,i,x,d,m,a,b,ceva,j;

    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    scanf("%ld%ld",&n,&m);
    l2[1]=0;
    for (i=1;i<=n;++i) {
        scanf("%ld",&x);
        rmq[0][i]=x;
        if (i>1)
            l2[i]=l2[(i>>1)]+1;
    }
    for (i=1;(1<<i)<=n;++i) {
        d=(1<<(i-1));
        for (j=1;j<=n-(1<<i)+1;++j)
            rmq[i][j]=min (rmq[i-1][j],rmq[i-1][j+d]);
    }
    for (i=1;i<=m;i++) {
        scanf("%ld%ld",&a,&b);
        d=l2[b-a+1];
        ceva=b-a+1-(1<<d);
        if (ceva)
            printf("%ld\n",min(rmq[d][a],rmq[d][a+ceva]));
        else  printf("%ld\n",rmq[d][a]);
    }
    return 0;
}