Pagini recente » Cod sursa (job #370572) | Cod sursa (job #2727927) | Cod sursa (job #2305593) | Cod sursa (job #895070) | Cod sursa (job #1766404)
#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
void ReadElements(vector<vector<int>> &rmq, int numberOfElements)
{
for( int i = 0; i<numberOfElements; ++i )
{
in>> 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;
in>> beginInterval>> endInterval;
out<< RangeMinimumQuery(rmq, beginInterval - 1, endInterval - 1)<< endl;
}
}
int main()
{
int numberOfElements;
int numberOfQueries;
in>> numberOfElements>> numberOfQueries;
vector<vector<int>> rmq(numberOfElements, vector<int>(log2(numberOfElements) + 1));
ReadElements(rmq, numberOfElements);
ConstructRangeMinimumQueryMatrix(rmq, numberOfElements);
ProcessingQueries(rmq, numberOfQueries);
in.close();
out.close();
return 0;
}