Cod sursa(job #1522184)

Utilizator GeorgianBaditaBadita Marin-Georgian GeorgianBadita Data 11 noiembrie 2015 12:41:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005
using namespace std;
int N,M,K, X, Y;
int D[21][Nmax], lg[Nmax];
FILE *f = freopen("rmq.in", "r", stdin);
FILE *g = freopen("rmq.out", "w", stdout);
inline int min_(int a, int b)
{
   if(a > b) return b;
   return a;
}
void read()
{
    scanf("%d%d", &N, &M); // citire
    lg[1] = 0;
    for(int i = 2; i<=N; i++)
        lg[i] = lg[i / 2] + 1; ///constriuire vector lg pentru apelare ulterioara
    for(int i = 1; i<=N; i++)
        scanf("%d", &D[0][i]);

}
void solve()
{
    for(int i = 1; i<=lg[N]; ++i)
        for(int j = 1; j<= N - (1 << (i - 1)); ++j)
            D[i][j] = min_(D[i - 1][j], D[i - 1][j + (1 << (i - 1))]); /// construirea matricei pt minime
        for(int i = 1; i<=M; i++)
        {
            scanf("%d%d", &X, &Y);
            int K = lg[Y - X + 1]; /// aflarea lui k in O(1)
            printf("%d\n", min_(D[K][X], D[K][Y - (1 <<K) + 1])); /// afisarea minimului din intervalul (X, Y)
        }
}
int main()
{
    read();
    solve();
    return 0;
}