Cod sursa(job #2469025)

Utilizator XsoundCristian-Ioan Roman Xsound Data 6 octombrie 2019 13:51:01
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define Dmax 17
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

struct cv
{
    int v[Dmax];
};

vector < cv > o;
vector < int > v;

int n,q;

void citesc ();
void rmq ();

int main()
{
    citesc();
}
void citesc ()
{
    int x, i1 ,i2, k, lg;

    fin >> n >> q;

    for ( int i = 1 ; i <= n; i++)
    {
        fin >> x;
        v.push_back (x) ;
    }

    rmq () ;

    for ( int i =1 ; i <= q; i++)
    {
        fin>> i1 >> i2 ;

        lg = (i2 - i1) +1 ;

        i1-- ;
        i2--;

        k = int ( log2 (lg) );

        fout << min ( v[o[i1].v[k]], v[o[i1+lg- (1 << k)].v[k]] );
    }

    fin.close();
}

void rmq ()
{
    for ( int i = 0; i < n; i++ )
        o[i].v[0] = i;

    for  ( int j = 1; (1<<j)<=n; j++ )
    {
        for ( int i = 0; i + (1<<j)-1< n; i++)
        {
            if ( o[i].v[j-1] < o[ i+ (1<<j) -1].v[j-1] )
                o[i].v[j] = o[i].v[j-1];
            else o[i].v[j] = o[ i+ (1<<j) -1 ].v[j-1];
        }
    }
}