Pagini recente » Cod sursa (job #728948) | Cod sursa (job #421687) | Cod sursa (job #1548087) | Cod sursa (job #119440) | Cod sursa (job #1752343)
#include <fstream>
#include <algorithm>
using namespace std;
int* ReadVector(int n, istream &fin);
int** CreateRmqMatrix(int n, int* list);
void ApplyQuerys(int m, int **matrix, int *list, istream &fin, ostream& fout);
int ComputeLog(int n);
int main()
{
ifstream fin;
ofstream fout;
fout.open("rmq.out");
fin.open("rmq.in");
int n, m;
fin >> n >> m;
int* list = ReadVector(n, fin);
int** matrix = CreateRmqMatrix(n, list);
ApplyQuerys(m, matrix, list, fin, fout);
fin.close();
fout.close();
return 0;
}
int* ReadVector(int n, istream &fin)
{
int *list = new int[n + 1]();
for (int i = 0; i < n; i++)
{
fin >> list[i];
}
return list;
}
int** CreateRmqMatrix(int n, int* list)
{
int lg = ComputeLog(n);
int** matrix = new int*[n + 1]();
for (int i = 0; i < n + 1; i++)
{
matrix[i] = new int[lg + 1]();
}
for (int i = 0; i < n; i++)
{
matrix[0][i] = i;
}
for (int i = 1; (1 << i) <= n; i++)
for (int j = 0; j + (1 << i) - 1 < n; j++)
if (list[matrix[i - 1][j]] < list[matrix[i - 1][j + (1 << (i - 1))]])
matrix[i][j] = matrix[i - 1][j];
else
matrix[i][j] = matrix[i - 1][j + (1 << (i - 1))];
return matrix;
}
void ApplyQuerys(int m, int **matrix, int *list, istream &fin, ostream& fout)
{
int x, y;
for (int i = 1; i <= m; i++)
{
fin >> x >> y;
if (x == y)
fout << list[matrix[0][x - 1]] << "\n";
else
{
int k = ComputeLog(y - x);
fout << min(list[matrix[k][x - 1]], list[matrix[k][y - (1 << k)]]) << "\n";
}
}
}
int ComputeLog(int n)
{
int r = 0;
while ((1 << r) <= n)
{
r++;
}
return --r;
}