Cod sursa(job #2549413)

Utilizator sipdavSipos David Oliver sipdav Data 17 februarie 2020 17:48:19
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

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

const int dim = 100001;

int n, m, v[dim], intv[dim][17], l[dim];

void prpr()
{
    l[1] = 0;
    for(int i = 2;i <= n;i++)
        l[i] = l[i >> 1] + 1;
    for(int i = 1;i <= n;i++)
        intv[i][0] = i;
    for(int j = 1; (1 << j) <= n;j++)
    {
        for(int i = 1;i + (1 << j) - 1 <= n;i++)
        {
            if(v[intv[i][j - 1]] < v[intv[i + (1 << (j - 1))][j - 1]])
                intv[i][j] = intv[i][j - 1];
            else
                intv[i][j] = intv[i + (1 << (j - 1))][j - 1];
        }
    }
}

int rmq(int x, int y)
{
    int k = l[y - x + 1];
    if(v[intv[x][k]] < v[intv[y - (1 << k) + 1][k]])
        return intv[x][k];
    return intv[y - (1 << k) + 1][k];
}

void read()
{
    in>>n>>m;
    for(int i = 1;i <= n;i++)
        in>>v[i];
}

void solve()
{
    prpr();
    int x, y;
    for(int i = 1;i <= m;i++)
    {
        in>>x>>y;
        out<<v[rmq(x, y)]<<'\n';
    }
}

int main()
{
    read();
    solve();
    return 0;
}