Pagini recente » Clasamentul arhivei de probleme | Clasamentul arhivei de probleme | Clasament arhiva | Borderou de evaluare (job #2010139) | Cod sursa (job #1224112)
#include <iostream>
#include <vector>
using namespace std;
int n, m, x;
vector<int> nrs;
int M[100001][17];
void init(){
for(int i = 0; i < 100000; i++){ // todo!
for(int j = 0; j < 17; j++)
M[i][j] = 100001;
}
for (int i = 0; i < n; i++)
M[i][0] = i;
for(int j = 1; (1 << j) <= n; j++){
for (int i = 0; i + (1 << j) - 1 < n; i++)
if (nrs[M[i][j - 1]] <= nrs[M[i + (1 << (j - 1))][j - 1]])
M[i][j] = M[i][j - 1];
else
M[i][j] = M[i + (1 << (j - 1))][j - 1];
}
}
int lg2(int x){
int cnt = 0;
while(1 << cnt <= x){
cnt++;
}
return cnt-1;
}
int rmq(int b, int e){
int min_pow = lg2(e-b+1);
if(nrs[M[b][min_pow]] < nrs[M[e-(1 << min_pow)+1][min_pow]]){
return M[b][min_pow];
}
return M[e-(1 << min_pow)+1][min_pow];
}
int main(){
int b, e;
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
//cin >> n >> m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++){
//cin >> x;
scanf("%d", &x);
nrs.push_back(x);
}
init();
for(int i = 0; i < m; i++){
scanf("%d%d", &b, &e);
//cin >> b >> e;
printf("%d\n", nrs[rmq(b-1, e-1)]);
}
return 0;
}