Pagini recente » Cod sursa (job #2011053) | Cod sursa (job #338983) | Cod sursa (job #1193441) | Cod sursa (job #1086089) | Cod sursa (job #3306359)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 100005;
int n, m, dp[Nmax][20], v[Nmax], log2[Nmax];
// dp[i][j] = min de pe int [i, i + 2^j-1]
void RMQ(){
for(int i = 1; i <= n; i++){
dp[i][0] = v[i];
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= log2[n]; j++){
if(i + (1 << j) - 1 <= n){
dp[i][j] = min(dp[i][j-1], dp[i + (1 << (j-1))][j-1]);
}
}
}
}
void preCalc(){
log2[1] = 0;
for(int i = 2; i <= Nmax; i++){
log2[i] = log2[i/2] + 1;
}
}
int query(int x, int y){
if(x == y){
return x;
}
if(x > y){
swap(x, y);
}
int len = y - x;
int p = log2[len];
int minim = min(dp[x][p], dp[y - len + 1][p]);
return minim;
}
int main()
{
ifstream fin("rmq.in");
ofstream fout("rmq.out");
fin >> n >> m;
for(int i = 1; i <= n; i++){
fin >> v[i];
}
preCalc();
RMQ();
while(m--){
int x, y;
fin >> x >> y;
fout << query(x, y) << "\n";
}
return 0;
}