Pagini recente » Cod sursa (job #730497) | Cod sursa (job #2954001) | Cod sursa (job #2633816) | Cod sursa (job #2964610) | Cod sursa (job #2301381)
#include <bits/stdc++.h>
#define Min(a, b) (a < b) ? a : b
using namespace std;
void ReadInputSpT(int &N, int &M, vector<int> &v, vector<vector<int>> &SparseTable, vector<int> &log_2, istream &f) {
f >> N >> M;
int value;
log_2.push_back(-1);
for(int i = 1; i <= N; i++) {
log_2.push_back(log_2[i / 2] + 1);
}
SparseTable.assign(N, vector<int>(log_2[N] + 1));
for(int i = 0; i < N; i++) {
f >> value;
v.push_back(value);
SparseTable[i][0] = i;
}
}
void PrecomputeSpT(int N, vector<int> v, vector<vector<int>> &SparseTable) {
for(int j = 1; (1 << j) <= N; j++)
for(int i = 0; i + (1 << j) - 1 < N; i++) {
if (v[SparseTable[i][j - 1]] <= v[SparseTable[i + (1 << (j - 1))][j - 1]]) {
SparseTable[i][j] = SparseTable[i][j - 1];
} else {
SparseTable[i][j] = SparseTable[i + (1 << (j - 1))][j - 1];
}
}
}
void PrintOutputSpT(int M, vector<int> v, vector<int> log_2, vector<vector<int>> SparseTable, istream &f, ostream &g) {
int left, right;
for(int i = 0; i < M; i++) {
f >> left >> right;
left--;
right--;
int lg = log_2[right - left + 1];
int solution = Min(v[SparseTable[left][lg]], v[SparseTable[right - (1 << lg) + 1][lg]]);
g << solution << "\n";
}
}
int main()
{
ifstream f;
f.open("rmq.in");
ofstream g;
g.open("rmq.out");
int N, M;
vector<int> log_2, v;
vector<vector<int>> SparseTable;
ReadInputSpT(N, M, v, SparseTable, log_2, f);
PrecomputeSpT(N, v, SparseTable);
PrintOutputSpT(M, v, log_2, SparseTable, f, g);
f.close();
g.close();
return 0;
}