Cod sursa(job #1404653)

Utilizator danyro364Savu Ioan Daniel danyro364 Data 28 martie 2015 13:47:58
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#define nmax 100001
#define inf 1<<30
using namespace std;
FILE *f=fopen("rmq.in","r"),*g=fopen("rmq.out","w");
int v[nmax],ai[4*nmax],a,b,n;
void init(int nod, int st, int dr)
{
    if(st==dr)
    {
        if(st<=n)
            ai[nod]=v[st];
        else
            ai[nod]=inf;
        return;
    }
    int mij=(st+dr)/2;
    init(nod*2,st,mij);
    init(nod*2+1,mij+1,dr);

    ai[nod]=min(ai[nod*2],ai[nod*2+1]);
}
int query(int nod, int st, int dr)
{
    if(a<=st&&dr<=b)
        return ai[nod];
    int mij=(st+dr)/2,q1=inf,q2=inf;
    if(a<=mij)
        q1=query(nod*2,st,mij);
    if(b>mij)
        q2=query(nod*2+1,mij+1,dr);
    return min(q1,q2);
}
int main()
{
    int p=1,m,i;
    fscanf(f,"%d %d",&n,&m);
    while(p<n)
        p*=2;
    for(i=1;i<=n;i++)
        fscanf(f,"%d",&v[i]);
    init(1,1,p);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d %d",&a,&b);
        fprintf(g,"%d\n",query(1,1,p));
    }
    return 0;
}