Cod sursa(job #185907)

Utilizator gigi_becaliGigi Becali gigi_becali Data 26 aprilie 2008 13:04:57
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
using namespace std;
#include <algorithm>
#include <cstdio>
#define DIM 8192
#define common \
    int m=(l+r)>>1, L=n<<1, R=L+1
char ax[DIM];
int poz;

int H[300001];
int a[100001];

inline void cit(int &x)
{
    x=0;
    while(ax[poz]<'0' || ax[poz]>'9') 
	if(++poz==DIM) fread(ax, 1, DIM, stdin), poz=0;

    while(ax[poz]>='0' && ax[poz]<='9')
    {
	x=x*10+ax[poz]-'0';
	if(++poz==DIM) fread(ax, 1, DIM, stdin), poz=0;
    }
}

inline void build(int n, int l, int r)
{
    if(l==r) { H[n]=a[l];return;}

    common;

    build(L, l,m); build(R, m+1, r);

    H[n]=min(H[L], H[R]);
}

inline int query(int n, int l, int r, int ql,int qr)
{
    if(l==ql && r==qr) return H[n];

    common;

    int sol=0x3f3f3f3f;
    
    if(ql<=m) sol=min(sol, query(L, l,m, ql, min(qr, m)));
    if(qr>m)  sol=min(sol, query(R,m+1, r, max(ql, m+1), qr));

    return sol;
}

int main()
{
    int n, m,i, p,q;

    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    cit(n); cit(m);
    for(i=1;i<=n;++i) cit(a[i]);
    
    build(1, 1, n);

    while(m--)
    {
	cit(p);cit(q);
	printf("%d\n", query(1, 1, n, p, q));
    }
    return 0;
}