Cod sursa(job #2252971)

Utilizator marcogoldPop Mihali Marco Silviu marcogold Data 3 octombrie 2018 14:00:15
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream fi("rmq.in");
ofstream fo("rmq.out");

int log[100006],dp[21][100006],n,m,first,second;
/// i putere de 2
int main()
{
    log[0]=0;
    log[1]=0;
    fi>>n>>m;
    for(int i=2; i<=n; i++)
        log[i]=log[i/2]+1;


    for(int i=0; i<n; i++)
        fi>>dp[0][i];


    for(int i=1; i<=log[n]; i++)

        for(int j=0; j<(n-(1<<i)+1); j++)
        {
            dp[i][j]=min(dp[i-1][j],dp[i-1][j+(1<<i-1)]);

        }

    for(int k=1; k<=m; k++)
    {
        fi>>first>>second;
        first--;
        second--;
        int lungime=second-first+1;
        int lg=log[lungime];

        fo<<min(dp[lg][first],dp[lg][second-(1<<lg)+1])<<endl;
    }

    return 0;
}