Cod sursa(job #2763100)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 11 iulie 2021 16:22:29
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <fstream>
#define NMAX 100005
#define MMAX 1000005
#define PMAX 17
#define INF 1e9
using namespace std;

ifstream cin("rmq.in");
ofstream cout("rmq.out");

int n,m;
int v[NMAX];
int rmq[NMAX][PMAX];
int lg[NMAX];

int main()
{
    cin>>n>>m;
    lg[0]=-1;///artificial
    v[0]=INF;
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
        rmq[i][0]=i;
        lg[i]=lg[i/2]+1;
    }
    for(int p=1;(1 << p)<=n;p++)
        for(int i=1;i +(1 << p)-1<=n;i++)
        {
            if(v[rmq[i][p-1]]<v[rmq[i][p]])
                rmq[i][p]=rmq[i][p-1];
            if(v[rmq[i+(1 << (p-1) )][p-1]]<v[rmq[i][p]])
                rmq[i][p]=rmq[i+(1 << (p-1) )][p-1];
        }
    for(int i=1;i<=m;i++)
    {
        int st,dr,L,rasp=INF,dif;
        cin>>st>>dr;
        if(st>dr)
            swap(st,dr);
        L=dr-st+1;
        dif=L-(1 << lg[L]);
        cout<<min(v[rmq[st][lg[L]]],v[rmq[st+dif][lg[L]]])<<'\n';
    }
    return 0;
}