Pagini recente » Cod sursa (job #573407) | Cod sursa (job #3341609) | Cod sursa (job #679616) | Cod sursa (job #1296633) | Cod sursa (job #3354199)
#include <fstream>
#include <utility>
#include <vector>
using namespace std;
vector<vector<int>> r;
vector<int> p2, v;
const int INF = 1e9;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
void precalcul(){
int n = (v.size() - 1);
p2.resize(n + 1);
p2[1] = 0;
for(int i = 2; i <= n; i++){
p2[i] = 1 + p2[i / 2];
}
int m = 0;
while((1 << (m + 1)) <= n){
m++;
}
r.resize(m + 1, vector<int>(n + 1, INF));
r[0] = v;
for(int i = 1; i <= n; i++){
for(int j = (1 << i); j <= n; j++){
int p = (1 << (i - 1));
r[i][j] = min(r[i - 1][j - p], r[i - 1][j]);
}
}
}
int main(){
int n, q;
cin >> n >> q;
for(int i = 1; i <= n; i++) cin >> v[i];
v.resize(n + 1);
precalcul();
for(int i = 0; i < n; i++){
int st, dr;
cin >> st >> dr;
if(st > dr){
swap(st, dr);
}
int k = p2[dr - st + 1];
int p = (1 << k);
cout << min(r[k][st + p - 1], r[k][dr]);
}
return 0;
}