Pagini recente » Cod sursa (job #2045906) | Cod sursa (job #1020895) | Rating Mircea Ion (the_best_01) | Cod sursa (job #2842175) | Cod sursa (job #1044932)
//O(NlogN), O(1)
#include <fstream>
#define in "rmq.in"
#define out "rmq.out"
#define Max_Size 100004
#define log2_Max_Size 18
std :: ifstream f(in);
std :: ofstream g(out);
int N, M;
int log2[Max_Size], ST[log2_Max_Size + 2][Max_Size]; //Sparse Table
inline void Read_Data()
{
f >> N >> M;
for(int i = 1; i <= N; ++i) f >> ST[i][0];
}
inline void Solve()
{
for(int i = 2; i < N; ++i) log2[i] = log2[i / 2] + 1;
for(int j = 1; (1 << j) <= N; ++j)
for(int i = 1; i + (1 << j) - 1 <= N; ++i)
{
ST[i][j] = std :: min(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]);
}
}
inline void RMQ()
{
int a, b;
for(int i = 1; i <= M; ++i)
{
f >> a >> b;
int k = log2[b - a + 1];
g << std :: min(ST[a][k], ST[b - (1 << k) + 1][k]) << '\n';
}
}
int main()
{
Read_Data();
Solve();
RMQ();
g.close();
return 0;
}