Cod sursa(job #2902813)

Utilizator BVLUBogdan Ivan BVLU Data 16 mai 2022 20:40:49
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <fstream>

using namespace std;

#define nmax 100001

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

struct Nod {
    int val;
    Nod *st, *dr;
};

int v[100000], n, m;

Nod* build( int st, int dr )
{
    Nod *nou = new Nod;
    if( st == dr )
    {
        nou->val = v[st];
        nou->st = NULL;
        nou->dr = NULL;
        return nou;
    }
    nou->st = build( st, ( st + dr ) / 2 );
    nou->dr = build( ( st + dr ) / 2 + 1, dr );
    nou->val = min( nou->st->val, nou->dr->val );
    return nou;
}

int interogare( Nod* nod, int st, int dr, int a, int b )
{
    if( a <= st && dr <= b )
        return nod->val;
    int maxSt = nmax, maxDr = nmax;
    int mij = ( st + dr ) / 2;
    if( a <= mij )
        maxSt = interogare( nod->st, st, mij, a, b );
    if( b > mij )
        maxDr = interogare( nod->dr, mij + 1, dr, a, b );
    return min( maxSt, maxDr );
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    f >> n >> m;
    for( int i = 0; i < n; ++i )
        f >> v[i];
    Nod *rad = build( 0, n - 1 );

    for( int i = 0; i < m; ++i )
    {
        int a, b;
        f >> a >> b;
        g << interogare( rad, 0, n - 1, a - 1, b - 1 ) << "\n";
    }
    f.close();
    g.close();
    return 0;
}