Cod sursa(job #2183564)

Utilizator PredaBossPreda Andrei PredaBoss Data 23 martie 2018 11:34:28
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int mn[18][100005],sir[100005],n,m,x,y;
int main()
{
    fin>>n>>m;
    for(int i=0;i<n;i++)
    {
        fin>>sir[i];
        mn[0][i]=i;
    }
    for(int i=1;(1<<i)<=n+1;i++){
        for(int j=0;j<=n-(1<<i);j++)
            {
                if(sir[mn[i-1][j]]>sir[mn[i-1][j+(1<<(i-1))]])
                    mn[i][j]=mn[i-1][j+(1<<(i-1))];
                else
                    mn[i][j]=mn[i-1][j];
            }}

    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        int j=0;
        while((1<<(j+1))<=y-x+1)
            j++;
        int p2=y-(1<<j);
        if(sir[mn[j][x-1]]>sir[mn[j][p2]])
            fout<<sir[mn[j][p2]]<<"\n";
        else
            fout<<sir[mn[j][x-1]]<<"\n";
    }
    return 0;
}