Cod sursa(job #2155689)

Utilizator Tataru_AdelinTataru Adelin Tataru_Adelin Data 8 martie 2018 00:00:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

int Query(int x,int y,vector<vector<int>>&rmq)
{
    int len=y-x;
    int p=31-__builtin_clz(len);
    return min(rmq[p][x],rmq[p][y-(1<<p)+1]);
}

void AddLine(int p,vector<vector<int>>&rmq)
{
    int n=rmq[0].size()-1,len=(1<<p);
    vector<int>line(n-len+2);

    for(int l=1,m=(len+1)/2,r=len;r<=n;l++,r++,m++)
    {
        line[l]=min(Query(l,m,rmq),Query(m+1,r,rmq));
    }

    rmq.push_back(line);
}



int main()
{
    int n,q;
    fin>>n>>q;
    vector<vector<int>>rmq(1);
    rmq[0].resize(n+1);
    for(int i=1;i<=n;i++)
        fin>>rmq[0][i];

    for(int p=1;n>(1<<p);p++)
    {
        AddLine(p,rmq);
    }

    int x,y;
    for(;q;q--)
    {
        fin>>x>>y;
        fout<<Query(x,y,rmq)<<'\n';
    }

    return 0;
}