Cod sursa(job #1843079)

Utilizator Walrus21andrei Walrus21 Data 8 ianuarie 2017 01:32:58
Problema Range minimum query Scor 40
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];

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]);
        j = i / s;
        if(A[i] < A[M[j]] || !(i % s))
            M[j] = i;
    }
    for(q = 0; q < m; q++)
    {
        scanf("%d %d", &i, &j);
        k = i - 1;
        r = N;
        while(k < j)
        {
            if(k % s || k + s > j)
                {
                    if(A[k] < r) r = A[k];
                    k++;
                }
            else
                {
                    if(A[M[k / s]] < r) r = A[M[k/s]];
                    k+=s;
                }
        }
        printf("%d\n", r);
    }
}