Cod sursa(job #1813689)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 23 noiembrie 2016 10:36:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#define NMAX 100023
FILE *fin, *fout;
int min(int a, int b)
{
    return (a< b)?a:b;
}
int log(int a)
{
    if(a == 1) return 0;
    return 1 + log(a/2);
}
int n, m, d[20][NMAX], size, x, y;
int query(int a, int b)
{
    int sizen = b-a+1;
    sizen = log(sizen);
    return min(d[sizen][a], d[sizen][b - (1<<sizen) + 1]);
}
int main()
{
    fin = freopen("rmq.in", "r", stdin);
    fout = freopen("rmq.out", "w", stdout);
    scanf("%d%d", &n, &m);
    size = log(n);
    for(int i = 0; i<= size; i++)
    {
        for(int j = 0; j< n; j++)
        {
            if(i == 0)
            {
                scanf("%d", &d[i][j]);
            }
            else
            {
                if(j + (1<<i) > n) break;
                d[i][j] = min(d[i-1][j], d[i-1][j + (1<<(i-1))]);
            }
        }
    }
    for(int i = 0; i< m; i++)
    {
        scanf("%d %d", &x, &y);
        x--;
        y--;
        printf("%d\n", query(x, y));
    }
    fclose(fin);
    fclose(fout);
    return 0;
}