Cod sursa(job #2469042)

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

struct cv
{
    int l[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;

    v.reserve(n+5);
    o.reserve(n+5);

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

    rmq () ;

    int c1,c2, *p=v.data();


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

        lg = (i2 - i1) +1 ;

        i1-- ;
        i2--;

        k = int ( log2 (lg) );

        c1 = o[i1].l[k];

        c2 = o[i1+lg- (1 << k)].l[k];

       fout << min(v[c1],v[c2]) << '\n' ;
    }

    fin.close();
}

void rmq ()
{
    int x,y;

    for ( int i = 0; i < n; i++ )
        o[i].l[0] = i;

    for  ( int j = 1; (1<<j) <= n; j++ )
    {
        for ( int i = 0; i + (1<<j)-1 < n; i++ )
        {
            x = o[i].l[j-1];
            y= o[ i+ (1<<(j-1)) ].l[ j-1 ] ;

            if ( v[ x ] < v[ y ] )
                o[i].l[j] = x;

           else o[i].l[j] = y;
        }
    }
}