Cod sursa(job #2550381)

Utilizator PaulOrasanPaul Orasan PaulOrasan Data 18 februarie 2020 19:30:00
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>

using namespace std;

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

const int NMAX=100010, inf=10000000;
int n,m;
int v[NMAX];
int arb[NMAX*10];
struct INTERVAL{
    int st,dr;
}interval[NMAX*10];

void citire()
{
    fin>>n>>m;
    for (int i=1; i<=n; i++){
        fin>>v[i];
    }
}
void construireArbore(int rad, int st, int dr)
{
    if (st==dr){
        interval[rad].st=st;
        interval[rad].dr=dr;
        arb[rad]=v[st];
    }else if (st<dr){
        interval[rad].st=st;
        interval[rad].dr=dr;
        int mij=(st+dr)/2;
        construireArbore(2*rad,st,mij);
        construireArbore(2*rad+1,mij+1,dr);
        arb[rad]=min(arb[2*rad],arb[2*rad+1]);
    }
}
int query(int rad, int st, int dr)
{
    if (interval[rad].st>=st && interval[rad].dr<=dr){
        return arb[rad];
    }else if (interval[rad].st>dr || interval[rad].dr<st){
        return inf;
    }
    return min(query(2*rad,st,dr),query(2*rad+1,st,dr));
}
void rezolvare()
{
    int a,b;
    for (int i=1; i<=m; i++){
        fin>>a>>b;
        fout<<query(1,a,b)<<'\n';
    }
}
int main()
{
    citire();
    construireArbore(1,1,n);
    rezolvare();
    fin.close();
    fout.close();
    return 0;
}