Cod sursa(job #235749)

Utilizator DastasIonescu Vlad Dastas Data 25 decembrie 2008 18:36:48
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 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 a[maxn], lg[maxn];
int rmq[maxn][maxlg];

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

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

    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 i = 1; i <= n; ++i )
        rmq[i][0] = a[i];

    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[i][j] = min(rmq[i][j - 1], rmq[t][j - 1]);
        }

    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[x][log], rmq[diff][log]));
    }


    return 0;
}