Cod sursa(job #1805437)

Utilizator maryan_lupMarian Lupascu maryan_lup Data 13 noiembrie 2016 20:17:14
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define DIMMAX 100005
#define LOGDIMMAX 17
#define FOR(i, a, b) for(int i = a; i <= b; i++)

using namespace std;

int M[DIMMAX][LOGDIMMAX];

void process2(int M[DIMMAX][LOGDIMMAX], int A[DIMMAX], int N)
{
    int i, j;

    //initialize M for the intervals with length 1
    for (i = 0; i < N; i++)
        M[i][0] = i;
    //compute values from smaller to bigger intervals
    for (j = 1; 1 << j <= N; j++)
        for (i = 0; i + (1 << j) - 1 < 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];
}

int rezultat(int i,int j,int M[DIMMAX][LOGDIMMAX], int A[DIMMAX])
{

    int k;
    k = log2(j - i + 1);
    if(A[M[i][k]] <= A[M[j - (1<<k) + 1][k]])
        return A[M[i][k]];
        return A[M[j - (1<<k) + 1][k]];


}

int main()
{
    ifstream f("rmq.in");
    ofstream g("rmq.out");

    int A[DIMMAX], n, m;

    f>>n>>m;
    FOR(i, 0, n-1)
        f>>A[i];

    process2(M, A, n);

    FOR(i, 1, m)
    {
        int x, y;
        f>>x>>y;
        g<<rezultat(x - 1, y - 1, M, A)<<'\n';
    }

    f.close();
    g.close();
    return 0;
}