Cod sursa(job #3152116)

Utilizator andiRTanasescu Andrei-Rares andiR Data 23 septembrie 2023 22:41:12
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <unordered_map>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <iomanip>
#include <vector>
#include <bitset>

#pragma GCC optimize("O3")
#define fi first
#define se second
#define pb push_back
#define pf push_front

using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
typedef long long ll;
const ll Nmax=1e5+5, inf=1e9+5;
using pii=pair<int, int>;

int n, m, v[Nmax], rmq[20][Nmax], p2[Nmax];
int querry (int l, int r){
    int d=r-l+1, p=p2[d];
    return min(rmq[p][l], rmq[p][r-(1<<p2[d])+1]);
}
int main()
{
    fin>>n>>m;
    for (int i=0; i<n; i++){
        fin>>v[i];
        rmq[0][i]=v[i];
    }
    ///precalculare
    int p=2, i=0;
    while (p<=n){
        i++;
        for (int j=0; j+p<=n; j++){
            rmq[i][j]=min(rmq[i-1][j], rmq[i-1][j+p/2]);
            fout<<rmq[i][j]<<' ';
        }
        fout<<'\n';
        p*=2;
    }
    p=1; int ind=-1;
    for (int i=1; i<=Nmax; i++){
        if (p==i){
            ind++;
            p*=2;
        }
        p2[i]=ind;
    }
    ///querryuri
    int a, b;
    for (int i=0; i<m; i++){
        fin>>a>>b;
        a--; b--;
        fout<<querry(a, b)<<'\n';
    }
    return 0;
}