Cod sursa(job #2266066)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 22 octombrie 2018 10:13:51
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX=1e5;

int N, M, i, j, X, Y, A[NMAX+5], K;

int RMQ[33][NMAX+5], ans;

int log2 (int X)
{
    int ans=0;

    int putere=1;

    while(putere<X)
    {
        putere*=2;
        ans++;
    }

    if(putere>X)
        ans--;

    return ans;
}

void precalculare()
{
    for(int i=1; i<=N; i++)
        RMQ[0][i]=A[i];

    for(int i=1; i<=log2(N); i++)
        for(int j=1; j<=(N-(1<<i)+1); j++)
            RMQ[i][j]=min(RMQ[i-1][j], RMQ[i-1][j+(1<<(i-1))]);
}

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

    scanf("%d%d", &N, &M);

    for(i=1; i<=N; i++)
        scanf("%d", &A[i]);

    precalculare();

    for(i=1; i<=M; i++)
    {
        scanf("%d%d", &X, &Y);

        K=log2(Y-X);

        ans=min(RMQ[K][X], RMQ[K][Y-(1<<K)+1]);

        printf("%d\n", ans);
    }

    return 0;
}