Cod sursa(job #1915734)

Utilizator vladbatalanBatalan Vlad vladbatalan Data 8 martie 2017 22:18:52
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>

using namespace std;

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

const int oo = 0x3f3f3f3f;
int n, m, ai[400066], x, y, st, dr, N, poz;

void Update_tree(int l, int d, int nod, int val)
{
    if(l == d)
    {
        ai[nod] = x;
        return;
    }
    int mi = (l+d)/2;
    if(poz <= mi) Update_tree(l, mi, nod*2, val);
    else Update_tree(mi+1, d, nod*2+1, val);
    ai[nod] = min(ai[nod*2], ai[nod*2+1]);
}

int Query(int l, int d, int nod)
{
    if(st<=l && d<=dr)
        return ai[nod];
    if(d<st || l > dr)
        return oo;
    int mi = (l+d)/2;
    return min(Query(l, mi, nod*2), Query(mi+1, d, nod*2+1));
}

int main()
{
    fin >> n >> m;
    for(N=1; N<=n; N<<=1);
    for(int i=1; i<=N*2+5; i++) ai[i] = oo;
    for(int i=1; i<=n; i++)
    {
        fin >> x;
        poz = i;
        Update_tree(1, N, 1, x);
//        fout<<"poz "<<i<<": ";
//        for(int i=1; i<=N*2-1; i++) fout<<ai[i]<<' ';
//        fout<<'\n';
    }
    for(int i=1; i<=m; i++)
    {
        fin >> st >> dr;
        fout << Query(1, N, 1)<< '\n';
    }

    return 0;
}