Cod sursa(job #1095820)

Utilizator kiralalaChitoraga Dumitru kiralala Data 31 ianuarie 2014 22:51:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#define NMAX 100005

using namespace std;

FILE* f=freopen("rmq.in","r",stdin);
FILE* o=freopen("rmq.out","w",stdout);

int n,m;
int v[NMAX];
int rmq[NMAX][20];
int a,b;

int Log(int x)
{
    int r=0;
    for(int i=1;i<=x;i<<=1,r+=1);

    return r-1;
}

void Preprocessing()
{
    for(int i=0;i<n;++i)
        rmq[i][0]=i;
    for(int j=1;1<<j<=n;++j)
        for(int i=0;i+(1<<j)-1<n;++i)
            if(v[rmq[i][j-1]]<v[rmq[i+(1<<(j-1))][j-1]])
                rmq[i][j]=rmq[i][j-1];
            else
                rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
}

int RMQ(int i, int j)
{
    int k=Log(j-i+1);
    int a=rmq[i][k];
    int b=rmq[j-(1<<k)+1][k];
    if(v[a]>v[b]) return b;
    return a;
}

int main()
{
    scanf("%d%d",&n,&m);

    for(int i=0;i<n;++i)
        scanf("%d",&v[i]);

    Preprocessing();

    for(int i=0;i<m;++i)
    {
        scanf("%d%d",&a,&b);

        printf("%d\n",v[RMQ(a-1,b-1)]);
    }

    return 0;
}