Cod sursa(job #2102459)

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

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++)
        {
            long Min=RMQ[i][j]=RMQ[i][j-1];
            int P=(P2(j-1));
            for(int k=1;k<=P;k++)
                Min=min(Min,RMQ[i+k][j-1]);
            RMQ[i][j]=Min;
        }
    }

    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;j<M;j++)
            result=min(result,RMQ[j][L]);
        g<<result<<'\n';

    }
    return 0;
}