Cod sursa(job #3170925)

Utilizator Alex_DumitrascuAlex Dumitrascu Alex_Dumitrascu Data 18 noiembrie 2023 11:17:33
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>

using namespace std;
int Log2[1000005];
int rmq[24][1000005];
int n, m;
void read()
{
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out","w", stdout);
    cin.tie(0); cout.tie(0);
    cin.sync_with_stdio(false);
    cout.sync_with_stdio(false);
    cin>>n>>m;
    for (int i=1; i<=n; i++) {
        cin>>rmq[0][i];
    }
}
void precalculate()
{
    for (int i=2; i<=n; i++) {
        Log2[i]=Log2[i/2]+1;
    }
    for (int i=1; (1<<i)<=n; i++) {
        for (int j=1; j<=n-(1<<i)+1; j++) {
            /*
            Intervalul care incepe la pozitia j
            si are 2^i elemente
            */
            rmq[i][j]=min(rmq[i-1][j],
                          rmq[i-1][j+(1<<(i-1))]);
        }
    }
}
void solve()
{
    int x, y;
    for (int i=1; i<=m; i++) {
        cin>>x>>y;
        int k=Log2[y-x+1];
        int int1=rmq[k][x];
        int int2=rmq[k][y-(1<<k)+1];
        int sol=min(int1, int2);
        cout<<sol<<'\n';
    }
}
int main()
{
    read();
    precalculate();
    solve();
    return 0;
}