Cod sursa(job #1688588)

Utilizator LucianTLucian Trepteanu LucianT Data 13 aprilie 2016 16:49:02
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <bits/stdc++.h>
#define maxN 100005
#define maxLog 18
using namespace std;
int n, m, i, j, st, dr, x, y, l, p, s;
int rmq[maxLog][maxN];
int v[maxN];
int lg[maxN];
int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(i=1; i <= n; i++)
        scanf("%d", &v[i]);
    lg[0]=1;
    for(i=2; i <= n; i++)
        lg[i]=1+lg[i/2];
    for(i=1; i <= n; i++)
        rmq[0][i]=v[i];
    for(i=1; (i<<1) <= n; i++)
        for(j=1; j <= n-(1<<i)+1; j++)
    {
        l=(1<<(i-1));
        rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+l]);
    }
    while(m--)
    {
        scanf("%d %d", &x, &y);
        l=y+1-x;
        p=lg[l];
        s=l-(1<<p);
        printf("%d\n", min(rmq[p][x], rmq[p][x+s]));
    }
    return 0;
}