Cod sursa(job #2562705)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 29 februarie 2020 17:17:43
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>
#define Dim 2*50001
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int rmq[Dim][20],A[Dim],N,M,a,b;

int main()
{
    f>>N>>M;
    for(int i=1;i<=N;i++) f>>A[i];

    for(int i=1;i<=N;i++) rmq[i][0]=i;

    for(int j=1;j<=log2(N);j++)
    for(int i=1;i+(1<<j)-1<=N;i++)
    if( A[ rmq[i][j-1] ] < A[ 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;
        if( a > b ) swap(a,b);
        int lg=log2(b-a+1);

        if( A[rmq[a][lg]] < A[rmq[ b - (1<<lg) + 1 ][ lg ]] )
            g<<A[rmq[a][lg]];
        else g<<A[rmq[ b-(1<<lg)+1][lg]];
        g<<'\n';
    }

    return 0;
}