Cod sursa(job #1100896)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 7 februarie 2014 16:57:38
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

int N,v[Nmax],dp[Nmax][20],put[25],prep[Nmax];

inline void Preproces()
{
    int i;
    put[0]=1;
    for(i=1;i<=20;++i)
        put[i]=put[i-1]*2;
    prep[1]=0;
    for(i=2;i<=100000;++i)
    {
        prep[i]=prep[i-1];
        if(i>=put[prep[i]+1])
            ++prep[i];
    }
}

inline void RMQ()
{
    int i,j;
    for(i=1;i<=N;++i)
        dp[i][0]=v[i];
    for(i=1;i<=N;++i)
        for(j=1;j<=20 && put[j]<=i;++j)
            dp[i][j]=min(dp[i][j-1], dp[i-put[j-1]][j-1]);
}

int main()
{
    int M,i,t,p,x,y;
    freopen ("rmq.in","r",stdin);
    freopen ("rmq.out","w",stdout);
    Preproces();
    scanf("%d%d", &N,&M);
    for(i=1;i<=N;++i)
        scanf("%d", &v[i]);
    RMQ();
    while(M--)
    {
        scanf("%d%d", &x,&y);
        t=prep[y-x+1];
        p=put[t];
        printf("%d\n", min(dp[y][t], dp[x+p-1][t]));
    }
    return 0;
}