Cod sursa(job #2679416)

Utilizator HermioneMatei Hermina-Maria Hermione Data 30 noiembrie 2020 15:29:40
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include<bits/stdc++.h>
using namespace std;

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

int N, M;

vector<int> v; /// input
vector<int> lg; /// log2 values
vector<vector<int>> spt; /// sparse table

void rd()
{
    f>>N>>M;

    lg.resize(N+1, 0);
    v.resize(N);
    spt.resize(N, vector<int>(lg[N] + 1));

    for(int i=0; i<N; i++)
        f>>v[i];
}

int query(int i, int j)
{
    int k = lg[j - i + 1];
    return min(v[spt[i][k]], v[spt[j + 1 - (1<<k)][k]]);
}

void init()
{
    for(int i=2; i<=N; i++)
    {
        lg[i] = lg[i - 1];
        lg[i] += (i % (1 << lg[i-1]) == 0);
    }

    for(int i=0; i<N; i++)
        spt[i][0] = i;

    for(int j=1; (1<<j)<=N; j++)
        for(int i=0; i + (1<<j) - 1 < N; i++)
            if(v[spt[i][j-1]] < v[spt[i + (1<<(j-1))][j-1]])
                spt[i][j] = spt[i][j-1];
            else
                spt[i][j] = spt[i + (1<<(j-1))][j-1];
}

void RMQ()
{
    init();

    for(int i=0; i<M; i++)
    {
        int l, r;
        f>>l>>r;

        ///g<<query(l, r)<<'\n';
        g<<query(l-1, r-1)<<'\n';
    }
}

int main ()
{
    rd();
    RMQ();

    f.close();
    g.close();
    return 0;
}