Pagini recente » Cod sursa (job #515679) | Cod sursa (job #3213119) | Cod sursa (job #839513) | Cod sursa (job #2745081) | Cod sursa (job #2691216)
#include<bits/stdc++.h>
#define int long long
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll,ll> pi;
const int mod = 1e9 + 9;
const int N = 106 * 106;
const int nax = 1e6+6;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ifstream in("rmq.in");
ofstream out("rmq.out");
int logaritm[100006];
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
//
logaritm[1] = 0;
for(int i = 2; i < 100006; i++) {
logaritm[i] = logaritm[i / 2] + 1;
}
int n, m;
in >> n >> m;
// n -> elemente
// m -> queryuri
int a[n + 1];
for(int i = 1; i <= n; i++) in >> a[i];
int mn[n + 1][30];
// (1 << n) = 2 ^ n
for(int i = 1; i <= n; i++) {
mn[i][0] = a[i];
// mn[i][0] --> i..i
}
// 2 ^ len --> lungimea intervalelor curente
for(int len = 1; (1 << len) <= n; len++) {
// acum precalculez raspunsurile pentru intervalele de lungime 2 ^ len
// 2 ^ len elemente incepand cu i
// i .. i + (2 ^ len) - 1
for(int i = 1; i + (1 << len) - 1 <= n; i++) {
mn[i][len] = min(mn[i][len - 1], mn[i + (1 << (len - 1))][len - 1]);
}
}
for(int i = 1; i <= m; i++) {
int l, r;
in >> l >> r;
int k = logaritm[r - l + 1];
out << min(mn[l][k], mn[r - (1 << k) + 1][k]) << '\n';
// sa impart intervalul l..r in doua intervale de lungime 2^k unde k un numar
// k = log(r - l + 1) --> r-l+1 lungimea
// 2^k lungimile intervalelor cu care voi imparti intervalul mare
// min(mn[l][k], mn[r - 2^k + 1][k]) --> raspunsul la query
}
return 0;
}