Cod sursa(job #1843088)

Utilizator Walrus21andrei Walrus21 Data 8 ianuarie 2017 02:26:34
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
#include <math.h>
#define N 100001

using namespace std;

int i, j, n, q, m, s, k, r, A[N], M[N][17];

int main()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);
    scanf("%d%d", &n, &m);
    s = sqrt(n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &A[i]);
        M[i][0] = i;
    }
    for(j = 1; 1 << j <= n; j++)
        for(i = 0; i + (1 << j) <= n; i++)
            if(A[M[i][j - 1]] < A[M[i + (1 << (j - 1))][j - 1]]) M[i][j] = M[i][j - 1];
            else M[i][j] = M[i + (1 << (j - 1))][j - 1];
    for(q = 0; q < m; q++)
    {
        scanf("%d%d", &i, &j);
        i--;
        j--;
        for(k = 0; 1 << (k + 1) <= j - i + 1; k++);
        if(A[M[i][k]] < A[M[j - (1 << k) + 1][k]]) r = A[M[i][k]];
        else r = A[M[j - (1 << k) + 1][k]];
        printf("%d\n", r);
    }
}