Pagini recente » Cod sursa (job #1498413) | Cod sursa (job #138975) | Cod sursa (job #2513897) | Cod sursa (job #51685) | Cod sursa (job #1766411)
#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;
}