Cod sursa(job #2713437)

Utilizator DanielznaceniDaniel Danielznaceni Data 27 februarie 2021 22:12:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <bits/stdc++.h>
#define lim 100005

using namespace std;

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

int n, m, mat[18][lim], v[lim], until;

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

void create_sparse_table()
{
    int pw=1;
    mat[0][0]=1;
    for(int i=1; i<=18; ++i)
    {

        pw=pw*2;
        mat[i][0]=pw;
        if(pw>n)
        {
            until=i-1;
            break;
        }
    }
    for(int i=0; i<=until; ++i)
    {
        for(int j=1; (j+mat[i][0]-1)<=n; j++)
        {
            if(i==0)
            {
                mat[i][j]=v[j];
            }
            else
            {
                mat[i][j]=min(mat[i-1][j], mat[i-1][j+mat[i-1][0]]);
            }
            //cout<<mat[i][j]<<" ";
        }
        //cout<<'\n'<<'\n'<<'\n';
    }
    /*for(int i=0; i<=until; ++i)
    {
        for(int j=0; j<=n; ++j)
        {
            cout<<mat[i][j]<<" ";
        }
        cout<<'\n';
    }*/
}

int find_pow(int x)
{
    int a=1;
    for(int i=0; i<=18; ++i)
    {
        if(a>x)
            return i-1;
        a=a*2;
    }
}

void solve()
{
    int x, y;
    for(int i=1; i<=m; ++i)
    {
        in>>x>>y;
        int lin=find_pow(y-x+1);
        out<<min(mat[lin][x],mat[lin][y-mat[lin][0]+1])<<'\n';

    }
}

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