Cod sursa(job #773302)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 1 august 2012 14:25:44
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>

using namespace std;

#define INF 2000000000
#define MAXS 350
#define MAXN 100005
#define MAXLOGN 20
int rmq[MAXN][MAXLOGN];
int v[MAXN];
int lg[MAXN];
int k, N, M, x, y;

int main() {
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out","w", stdout);

	scanf("%d %d", &N, &M);
	for(int i = 0; i < N; i++)
        scanf("%d", &v[i]);

    lg[1] = 0;
    for(int i = 2; i <= MAXLOGN; i++)
        lg[i] = lg[i / 2] + 1;

    for(int i = 0; i < N; i++)
        rmq[i][0] = v[i];

    for(int j = 1; (1 << j) <= N; j++)
        for(int i = 0; i + (1 << j) <= N; i++)
            rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);

    for(int i = 0; i < M; i++) {
        scanf("%d %d", &x, &y);
        x--; y--;

        int k = lg[y - x + 1];
        int res = min(rmq[x][k], rmq[y - k][k]);

        printf("%d\n", res);
    }

	return 0;
}