Cod sursa(job #2708208)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 18 februarie 2021 13:22:20
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
//Ilie Dumitru
#include<cstdio>

int N, M, v[100000], rmq[100000][17];

int log(int N)
{
    int p=1, c=0;
    while(p<=N)
    {
        c++;
        p<<=1;
    }
    return c-1;
}

int min(int a, int b)
{
    return a+(b-a)*(b<a);
}

void preprocesare()
{
    int i, j, k=1;
    for(i=0;i<N;++i)
        rmq[i][0]=v[i];
    for(j=1;j<=N;j<<=1, k++)
        for(i=0;i<=N-j;++i)
            rmq[i][k]=min(rmq[i][k-1], rmq[i+j][k-1]);
}

int solve(int st, int dr)
{
    int l=log(dr-st+1);
    return min(rmq[st][l], rmq[dr-(1<<l)+1][l]);
}

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    int i, a, b;
    scanf("%i", &N);
    scanf("%i", &M);
    for(i=0;i<N;++i)
        scanf("%i", &v[i]);
    preprocesare();
    while(M--)
    {
        scanf("%i", &a);
        scanf("%i", &b);
        printf("%i\n", solve(a-1, b-1));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}