Pagini recente » Cod sursa (job #2730968) | Cod sursa (job #2682049) | Cod sursa (job #2529328) | Cod sursa (job #1735948) | Cod sursa (job #2235712)
#include<bits/stdc++.h>
using namespace std;
int v[100040],mat[100700][17];
void preprocess(int n){
for(int i = 0 ; i< n ; i ++)
mat[i][0] = i;
for(int j = 1 ; (1 << j) <= n ; j++)
for(int i = 0 ; i + (1 << j) - 1 < n ; i++)
if(v[mat[i][j-1]] < v[mat[(1 << j-1)+i][j-1]])
mat[i][j] = mat[i][j-1];
else
mat[i][j] = mat[(1 << j-1)+i][j-1];
}
int get_min(int left , int right ){
int l = right - left +1 ;
int k = (int)log2(l);
return min(v[mat[left][k]],v[mat[right - (1 << k ) + 1 ][k]]);
}
int main(){
ifstream in("rmq.in");
ofstream out("rmq.out");
int n , m ;
in >> n >> m ;
for(int i = 0 ; i < n ; i ++)
in >> v[i];
preprocess(n);
for(int i = 0 ; i < m ; i++){
int l , r , ans;
in >> l >> r ;
l--;
r--;
ans = get_min(l,r);
out << ans << '\n';
}
}