Cod sursa(job #1800631)

Utilizator al_k_ponyClaudiu Babin al_k_pony Data 7 noiembrie 2016 22:15:41
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include        <bits/stdc++.h>
#define ll      long long
#define maxn    100001
#define rc(s)   return cout << s,0
#define _       ios_base::sync_with_stdio(false);cin.tie(0);
#define mp      make_pair
#define pii     pair<int,int>
#define vi      vector<int>
#define vll     vector<long long>
using namespace std;

const int inf = INT_MAX;

int a[maxn],t[4*maxn],mid,n,m,x,y;

inline void build(int nod, int l, int r)
{
    if(l == r)
        t[nod] = a[l];
    else
    {
        mid = (l+r)/2;
        build(nod << 1,l,mid);
        build(nod << 1 | 1,mid+1,r);
        t[nod] = min(t[nod << 1],t[nod << 1 | 1]);
    }
}

inline int qry(int nod,int l,int r,int start,int finish)
{
    if(l >= start && r <= finish)
        return t[nod];
    if(l > finish || start > r) return inf;
    mid = (l+r)/2;
    return min(qry(nod << 1,l,mid,start,finish),qry(nod << 1 | 1,mid+1,r,start,finish));
}


int main(){
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    int n;
    scanf("%d %d",&n,&m);
    for(int i = 1;i<=n;i++)
        scanf("%d",&a[i]);
    build(1,1,n);
    for(int q = 1;q<=m;q++)
    {
        scanf("%d %d",&x,&y);
        printf("%d\n", qry(1,1,n,x,y));
    }
    return 0;
}