Cod sursa(job #672952)

Utilizator ukiandreaAndreea Lucau ukiandrea Data 3 februarie 2012 15:27:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#include <math.h>

int a[100000];
int m[100000][18];

// we initialize m[i][j] tp hold the min in interval [i, i + 2 ^j]
void initialize(int n)
{
    for (int i = 0; i < n; i++)
        m[i][0] = i;

    for (int j = 1; (1 << j) <= n; j++) {
        for (int i = 0; (i + (1 << j) - 1) < n; i++) {
            int a1 = a[m[i][j - 1]];
            int a2 = a[m[i + (1 << (j - 1))][j - 1]];

            m[i][j] = (a1 < a2) ? m[i][j - 1] : m[i + (1 << (j - 1))][j - 1];
        }
    }
}

// Query for the min in [x, y] through <node>
int query(int i, int j)
{
    int k = log(j - i + 1) / log(2);

    int a1 = a[m[i][k]];
    int a2 = a[m[j - (1 << k) + 1][k]];

    return (a1 < a2) ? m[i][k] : m[j - (1 << k) + 1][k];
}

int main()
{
    int n, m;

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

    scanf("%d %d\n", &n, &m);

    for (int i = 0; i < n; i++) 
        scanf("%d\n", &a[i]);

    initialize(n);

    for (int i = 0; i < m; i++) {
        int x, y;
        scanf("%d %d\n", &x, &y);
        printf("%d\n", a[query(x - 1, y - 1)]);
    }

    return 0;
}