Cod sursa(job #235750)

Utilizator DastasIonescu Vlad Dastas Data 25 decembrie 2008 18:38:37
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <cstdio>

const int maxn = 100001;
const int maxlg = 18;

FILE *in = fopen("rmq.in","r"), *out = fopen("rmq.out","w");

int n, m;
int lg[maxn];
int rmq[maxlg][maxn];

void read()
{
    fscanf(in, "%d %d", &n, &m);

    for ( int i = 1; i <= n; ++i )
        fscanf(in, "%d", &rmq[i][0]);

    for ( int i = 2; i <= n; ++i )
        lg[i] = lg[i >> 1] + 1;
}

inline int min(int x, int y)
{
    return x < y ? x : y;
}

int main()
{
    read();

    for ( int j = 1; (1 << j) <= n; ++j )
        for ( int i = 1; i + (1 << (j - 1)) <= n; ++i )
        {
            int t = i + (1 << (j - 1));
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][t]);
        }

    int x, y;
    for ( int i = 1; i <= m; ++i )
    {
        fscanf(in, "%d %d", &x, &y);

        int log = lg[y - x + 1];
        int diff = y - (1 << log) + 1;

        fprintf(out, "%d\n", min(rmq[log][x], rmq[log][diff]));
    }


    return 0;
}