Cod sursa(job #2479684)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 24 octombrie 2019 11:11:21
Problema Range minimum query Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 0.82 kb
#include <stdio.h>
#include <stdlib.h>

long int r[20][100005];
long int n,m,st,dr,k;

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

    /*read*/
    scanf("%ld%ld", &n,&m);
    for(int i = 1; i <= n; ++i)
        scanf("%ld", &r[0][i]);

    /*init*/
    for(int i = 1; (1<<i) <= n; ++i)
        for(int j = 1; j+(1<<(i-1)) <= n; ++j)
            r[i][j] = (r[i-1][j] <= r[i-1][j+(1<<(i-1))]) ? r[i-1][j] : r[i-1][j+(1<<(i-1))];

    /*solve*/
    for(;m;--m){
        scanf("%d%d", &st,&dr);
        k=0;
        long int aux = dr-st+1;
        while((1<<k)<=aux)
            ++k;
        --k;
        if(r[k][st] < r[k][dr-(1<<(k))+1])
            printf("%ld\n", r[k][st]);
        else
            printf("%ld\n", r[k][dr-(1<<(k))+1]);
    }

    return 0;
}