Cod sursa(job #3214237)

Utilizator AndreiBOTOBotocan Andrei AndreiBOTO Data 13 martie 2024 22:08:09
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

#define cin fin
#define cout fout

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

const int LGMAX=25;
const int NMAX=1e5+5;

int rmq[LGMAX][NMAX];
int lg[NMAX];
int v[NMAX];

int query(int x,int y)
{
    int interv=y-x+1;
    int l=lg[interv];
    return min(rmq[l][x],rmq[l][x+interv-(1<<l)]);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n,m,i,j,e;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        cin>>v[i];
        rmq[0][i]=v[i];
    }
    lg[1]=0;
    for(i=2;i<=n;i++)
        lg[i]=lg[i/2]+1;
    for(e=1;(1<<e)<=n;e++)
    {
        for(i=1;i<=n;i++)
        {
            if(i+(1<<(e-1))>n)
                continue;
            rmq[e][i]=min(rmq[e-1][i],rmq[e-1][i+(1<<(e-1))]);
        }
    }
    for(i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        cout<<query(x,y)<<"\n";
    }
    return 0;
}