Cod sursa(job #1234235)

Utilizator afkidStancioiu Nicu Razvan afkid Data 26 septembrie 2014 22:15:56
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>

using namespace std;

const char InFile[]="rmq.in";
const char OutFile[]="rmq.out";
const int DIMN=100010;
const int DIMLG=20;

inline int MIN(int a,int b)
{
    return ((a>b)?b:a);
}

int n,m,v[DIMN],s[DIMN][DIMLG],lg[DIMN];


int main()
{
    int i,j,t,l,a,b,dif;
    freopen(InFile,"r",stdin);
    freopen(OutFile,"w",stdout);
    scanf("%d %d",&n,&m);
    lg[1]=0;
    for(i=2;i<n;++i)
        lg[i]=lg[i/2]+1;
    for(i=1;i<=n;++i)
        scanf("%d",&v[i]);
    for(i=1;i<=n;++i)
        s[i][0]=i;
    for(j=1;(1<<j)<=n;++j)
    {
        for(i=0;i+(1<<j)-1<=n;++i)
        {
            if(v[s[i][j-1]]<=v[s[i+(1<<(j-1))][j-1]])
                s[i][j]=s[i][j-1];
            else s[i][j]=s[i+(1<<(j-1))][j-1];
        }
    }
    for(i=1;i<=m;++i)
    {
        scanf("%d %d",&a,&b);
        dif=b-a+1;
        l=lg[dif];
        t=dif-(1<<l);
        printf("%d\n",MIN(v[s[a][l]],v[s[a+t][l]]));
    }
    return 0;
}