Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
Advertisement
Add Comment
Please, Sign In to add comment