Cod sursa(job #2173960)

Utilizator NicuBaciuNicu Baciu NicuBaciu Data 16 martie 2018 09:59:25
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>
#include <fstream>
#include <climits>

using namespace std;

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

int seg[300000];
int a[100002];

int n, m;

void constr_segtree(int st, int dr, int pos)
{
    if(st==dr)
    {
        seg[pos]=a[st];
        return;
    }

    int mid=(st+dr)/2;

    constr_segtree(st, mid, 2*pos+1);
    constr_segtree(mid+1, dr, 2*pos+2);

    seg[pos]=min(seg[2*pos+1], seg[2*pos+2]);
}

int query(int qst, int qdr, int st, int dr, int pos=0)
{
    if(qst<=st && dr<=qdr)
    {
        return seg[pos];
    }
    else if(st>qdr || dr<qst)
    {
        return INT_MAX;
    }
    else
    {
        int minval;
        int minst, mindr;
        int mid=(st+dr)/2;

        minst=query(qst, qdr, st, mid, 2*pos+1);
        mindr=query(qst, qdr, mid+1, dr, 2*pos+2);

        return min(minst, mindr);
    }
}

int main()
{
    fin >> n >> m;

    for(int i=0; i<n; i++)
        fin >> a[i];

    constr_segtree(0, n-1, 0);

    for(int i=0; i<m; i++)
    {
        int st, dr;

        fin >> st >> dr;

        fout << query(st-1, dr-1, 0, n-1) << '\n';
    }

    return 0;
}