Cod sursa(job #1955665)

Utilizator VicktorVictor Teodor Stoian Vicktor Data 6 aprilie 2017 09:46:33
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <cstdio>
#define NMAX 100002
#define inf 1<<30
using namespace std;
ofstream cout("rmq.out");
int Arb[NMAX*3];
int pos,x,a,b,n,m;
inline void Update(int nivel, int s, int d)
{
    int mijl;
    if(s==d) Arb[nivel]=x;
    else
    {
        mijl=(s+d)/2;
        if(pos<=mijl) Update(nivel*2,s,mijl);
        else Update(nivel*2+1,mijl+1,d);
        Arb[nivel]=min(Arb[nivel*2],Arb[nivel*2+1]);
    }
}
inline int Query(int nivel, int s, int d)
{
    int sol1=inf,sol2=inf,mijl;
    if(a<=s && d<=b) return Arb[nivel];
    else
    {
        mijl=(s+d)/2;
        if(a<=mijl) sol1=Query(nivel*2,s,mijl);
        if(b>mijl) sol2=Query(nivel*2+1,mijl+1,d);
        return min(sol1,sol2);
    }
}
int main()
{
    int i;
    FILE*cin=freopen("rmq.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; i++) Arb[i]=inf;
    for(pos=1; pos<=n; pos++)
    {
        scanf("%d",&x);
        Update(1,1,n);
    }
    for(i=1; i<=m; i++)
    {
        scanf("%d%d",&a,&b);
        cout<<Query(1,1,n)<<'\n';
    }
    return 0;
}