Cod sursa(job #3226865)

Utilizator andystarzSuna Andrei andystarz Data 23 aprilie 2024 09:49:22
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>

using namespace std;
int rmq[100005][20];
int join (int a, int b)
{
    return min(a, b);
}
void build (int n)
{
    int cnt=1;
    int put=2;
    while (put<=n)
    {
        for (int i=1; i<=n-put+1; i++)
        {
            rmq[i][cnt]=join(rmq[i][cnt-1], rmq[i+put/2][cnt-1]);
        }
        put*=2;
        cnt++;
    }
    return;
}
int main()
{
    ifstream cin ("rmq.in");
    ofstream cout ("rmq.out");
    int n, m, l, r;
    cin>>n>>m;
    for (int i=1; i<=n; i++)
    {
        cin>>rmq[i][0];
    }
    build (n);
    for (int i=0; i<=3; i++)
    {
        for (int j=1; j<=n; j++)
        {
            cout<<rmq[j][i]<<" ";
        }
        cout<<'\n';
    }
    int length=0;
    int cnt=0, put=1;
    for (int i=1; i<=m; i++)
    {
        cnt=0, put=1;
        cin>>l>>r;
        length=r-l+1;
        while (2*put<=length)
        {
            cnt++;
            put*=2;
        }
        cout<<join(rmq[l][cnt], rmq[r-put+1][cnt])<<'\n';
        //cout<<rmq[l][cnt]<<" "<<rmq[r-put+1][cnt]<<'\n';
    }
}