Cod sursa(job #2252968)

Utilizator marcogoldPop Mihali Marco Silviu marcogold Data 3 octombrie 2018 13:56:52
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <iostream>
#include <fstream>
using namespace std;

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

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

    for(int i=2; i<=20; i++)
        log[i]=log[i/2]+1;

    fi>>n>>m;

    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;
    }


    /*  for(int i=0; i<17; i++)
      {
          for(int j=0; j<n; j++)
              cout<<dp[i][j]<<" ";
          cout<<endl;
      }*/
    return 0;
}