Cod sursa(job #2258329)

Utilizator CezarTDTodirisca Cezar CezarTD Data 11 octombrie 2018 11:21:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <bits/stdc++.h>

using namespace std;

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

const int N = 100010;
int n,m,i,j,p[N],lin[N];
int L,x,y;
vector<vector<int>>rmq;
int main()
{
    f>>n>>m;
    for(i=2;i<=n;i<<=1)lin[i]=1;
    for(i=1;i<=n;i++)lin[i]+=lin[i-1];
    rmq.push_back(vector<int>(n,0));
    for(i=n,j=2;i-j+1>0;j<<=1)
        rmq.push_back(vector<int>(i-j+1,0));
    for(i=0;i<n;i++)
    {
        f>>rmq[0][i];
    }

    L=lin[n];
    for(i=0,j=1;j<=L;i++,j++)
    {
        auto lo=rmq[i].begin();
        auto hi=lo+(1<<i);
        auto dest=rmq[j].begin();
        auto stop=rmq[j].end();
        for(;dest!=stop;lo++,hi++,dest++)
            *dest=min(*lo,*hi);
    }
    for(;m;m--)
    {
        f>>x>>y;x--;y--;
        i=lin[y-x+1];
        y=y-(1<<i)+1;
        g<<min(rmq[i][x],rmq[i][y])<<'\n';

    }
    return 0;
}