Pagini recente » Cod sursa (job #1801394) | Cod sursa (job #1749460) | Cod sursa (job #1906485) | Cod sursa (job #1269159) | Cod sursa (job #3306360)
#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 p = 1; (1 << p) <= n; p++){
for(int i = 1; i <= n; i++){
dp[i][p] = dp[i][p-1];
int j = i + (1 << (p-1));
if(j <= n && dp[i][p] > dp[j][p-1]){
dp[i][p] = dp[j][p-1];
}
}
}
}
void preCalc(){
log2[1] = 0;
for(int i = 2; i <= Nmax; i++){
log2[i] = log2[i/2] + 1;
}
}
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 st, dr;
fin >> st >> dr;
int len = dr - st + 1;
int p = log2[len];
int jum = 1 << p;
fout << min(dp[st][p], dp[dr - p][p]) << "\n";
}
return 0;
}