Cod sursa(job #2376232)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 8 martie 2019 14:19:40
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.8 kb
#include <bits/stdc++.h>
#define Dim 100006
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int N,M,V[Dim],rmq[Dim][18],lg[Dim];
int a,b;

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++) f>>V[i];
    lg[2]=1;
    for(int i=3;i<=N;i++) lg[i]=lg[i>>1]+1;

    for(int i=1;i<=N;i++) rmq[i][0]=i;
    for(int j=1;(1<<j)<=N;j++)
        for(int i=1;i+(1<<j)-1<=N;i++)
    {
        if(V[rmq[i][j-1]]<=V[rmq[i+(1<<(j-1))][j-1]])
            rmq[i][j]=rmq[i][j-1];
        else
            rmq[i][j]=rmq[i+(1<<(j-1))][j-1];
    }
    for(int i=1;i<=M;i++)
    {
        f>>a>>b;
        int dif=b-a+1;
        int pr=lg[dif];
        if(V[rmq[a][pr]]<=V[rmq[b-(1<<pr)+1][pr]]) g<<V[rmq[a][pr]]<<'\n';
        else g<<V[rmq[b-(1<<pr)+1][pr]]<<'\n';
    }
    return 0;
}