Cod sursa(job #2102454)

Utilizator GiihuoTihufiNeacsu Stefan GiihuoTihufi Data 8 ianuarie 2018 20:41:48
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>
#include <math.h>
#include <iostream>

#define V(n) RMQ[(n)][0]

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

long N,K;

long P2(long x)
{
    return (1<<(x));
}

int main()
{
    f>>N>>K;

    int L=log2(N);

    long RMQ[N][L+1];

    for(int i=0;i<N;i++)
        f>>RMQ[i][0];

    int N1=N;
    for(int j=1;j<=L;j++)
    {
        N1-=P2(j-1);
        for(int i=0;i<N1;i++)
        {
            RMQ[i][j]=RMQ[i][j-1];
            int P=(P2(j-1));
            for(int k=1;k<=P;k++)
                RMQ[i][j]=min(RMQ[i][j],RMQ[i+k][j-1]);
        }
    }

    int st,dr;
    long result;;

    for(int i=0;i<K;i++)
    {
        f>>st>>dr;
        int L=log2(dr-st+1);
        result=RMQ[st-1][L];

        int M=dr-P2(L)+1;
        for(int j=st+1;j<=M;j++)
            result=min(result,RMQ[j-1][L]);
        g<<result<<'\n';

    }


    return 0;
}