Cod sursa(job #1180998)

Utilizator dropsdrop source drops Data 1 mai 2014 16:44:10
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <cstdio>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 100005

int r[MAX][18], n, m, x, y, k;

void rmq() {
    for (int j = 1; (1 << j) < n; j++) {
        for (int i = 0; i + (1 << j) - 1 < n; i++)
            r[i][j] = min(r[i][j-1], r[i + (1 << (j-1))][j-1]);
    }
}

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", &r[i][0]);

    rmq();

    for (int i = 0; i < m; i++) {
        scanf("%d %d", &x, &y);
        x--; y--;
        if (y < x) swap(x, y);
        k = log(y-x+1)/log(2);
        printf("%d\n", min(r[x][k], r[y-(1<<k)+1][k]));
    }

    return 0;
}