Pagini recente » Cod sursa (job #1005617) | Cod sursa (job #3142137)
/*
d[i][j] - minimul din secventa de lungime
2^i care incepe pe pozitia j
*/
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define VMAX 100003
#define LOGMAX 17
int n, queries;
int v[VMAX], d[LOGMAX + 1][VMAX], lg[VMAX];
void init(){
lg[1] = 0;
for(int j = 1; j <= n; ++j){
d[0][j] = v[j];
if(j != 1){
lg[j] = lg[j / 2] + 1;
}
}
for(int i = 1; i <= lg[n]; ++i){
for(int j = 1; j + (1 << i) - 1 <= n; ++j){
d[i][j] = min(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]);
}
}
}
int query(int stanga, int dreapta){
int min_1, min_2;
int aux = lg[dreapta - stanga + 1];
min_1 = d[aux][stanga];
min_2 = d[aux][dreapta - (1 << aux) + 1];
return min(min_1, min_2);
}
void solve(){
cin >> n >> queries;
for(int i = 1; i <= n; ++i){
cin >> v[i];
}
init();
int stanga, dreapta;
for(int i = 0; i < queries; ++i){
cin >> stanga >> dreapta;
cout << query(stanga, dreapta) << '\n';
}
}
int main(){
ios_base::sync_with_stdio(false);
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
return 0;
}