Cod sursa(job #773098)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 1 august 2012 00:09:04
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 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
int A[MAXS];
int v[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]);

    for(k = 1; k * k <= N; k++);
    k--;

    for(int i = 0; k * i <= N; i++) {
        A[i] = INF;
        for(int j = k * i; j < k * (i + 1); j++)
            A[i] = min(A[i], v[j]);
    }

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

        int res = INF;
        int i;
        for(i = x; i % k != 0 && i <= y; i++)
            res = min(res, v[i]);
        for(; i + k < y; i += k)
            res = min(res, A[i / k]);
        for(; i <= y; i++)
            res = min(res, v[i]);

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


	return 0;
}