Cod sursa(job #2740784)

Utilizator giotoPopescu Ioan gioto Data 14 aprilie 2021 12:45:13
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
	
using namespace std;
	
 
	
int x, y, n, q, a[100005], lg[100005], rmq[31][100005];
	
inline int min(int x, int y){
	
    return (x < y) ? x : y;
	
}
	
int main()
	
{
	
    freopen("rmq.in", "r", stdin);
	
    freopen("rmq.out", "w", stdout);
	
    scanf("%d%d", &n, &q);
	
    for(int i = 1; i <= n ; ++i)
	
        scanf("%d", &a[i]);
	
    for(int i = 1; i <= n ; ++i)
	
        rmq[0][i] = a[i];
	
    for(int j = 1; (1 << j) <= n ; ++j){
	
        for(int i = 1; i <= n - (1 << j) + 1; ++i){
	
            rmq[j][i] = min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]);
	
        }
	
    }
	
    for(int i = 2; i <= n ; ++i)
	
        lg[i] = lg[i / 2] + 1;
	
    for(int i = 1; i <= q ; ++i){
	
        scanf("%d%d", &x, &y);
	
        int d = y - x + 1, l = lg[d];
	
        int sh = d - (1 << l);
	
        printf("%d\n", min(rmq[l][x], rmq[l][x + sh]));
	
    }
	
    return 0;
	
}