Cod sursa(job #1766411)

Utilizator enacheionutEnache Ionut enacheionut Data 27 septembrie 2016 22:02:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>
#include <math.h>
#include <vector>

using namespace std;

void ReadElements(vector<vector<int>> &rmq, int numberOfElements)
{
    for( int i = 0; i<numberOfElements; ++i )
    {
        scanf("%d", &rmq[i][0]);
    }
}

void ConstructRangeMinimumQueryMatrix(vector<vector<int>> &rmq, int numberOfElements)
{
    for( int j = 1; (1 << j) <= numberOfElements; ++j )
    {
        for( int i = 0; (i + (1 << j) - 1) < numberOfElements; ++i )
        {
            rmq[i][j] = min( rmq[i][j-1], rmq[i + (1 << (j-1))][j-1] );
        }
    }
}

int RangeMinimumQuery(vector<vector<int>> &rmq, int beginInterval, int endInterval)
{
    int lengthInterval = endInterval - beginInterval + 1;
    int step = log2(lengthInterval);

    return min(rmq[beginInterval][step], rmq[endInterval - (1 << step) + 1][step]);
}

void ProcessingQueries(vector<vector<int>> &rmq, int numberOfQueries)
{
    while( numberOfQueries-- )
    {
        int beginInterval;
        int endInterval;
        scanf("%d%d", &beginInterval, &endInterval);

        printf("%d\n", RangeMinimumQuery(rmq, beginInterval - 1, endInterval - 1) );
    }
}

int main()
{
    int numberOfElements;
    int numberOfQueries;

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

    scanf("%d%d", &numberOfElements, &numberOfQueries);
    vector<vector<int>> rmq(numberOfElements, vector<int>(log2(numberOfElements) + 1));
    ReadElements(rmq, numberOfElements);

    ConstructRangeMinimumQueryMatrix(rmq, numberOfElements);
    ProcessingQueries(rmq, numberOfQueries);

    return 0;
}