Cod sursa(job #2708596)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 19 februarie 2021 08:30:34
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
//Ilie Dumitru
#include<cstdio>

int N, M, rmq[100004][18];

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(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", &rmq[i][0]);
    preprocesare();
    printf("%i ", log(66567));
    while(M--)
    {
        scanf("%i", &a);
        scanf("%i", &b);
        printf("%i\n", solve(a-1, b-1));
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}