Cod sursa(job #1801978)

Utilizator al_k_ponyClaudiu Babin al_k_pony Data 9 noiembrie 2016 19:10:29
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include        <bits/stdc++.h>
#define ll      long long
#define maxn    200005
#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>
using namespace std;

const int inf = INT_MAX;
int n,m,val,pos,x,y,z,start,finish;
int t[420420],a[420420];

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

int qry(int nod,int tl,int tr,int l,int r)
{
    if(l > r) return inf;
    if(l== tl && r == tr) return t[nod];
    int tm = (tl+tr)/2;
    return min(qry(nod << 1, tl , tm, l, min(r,tm)),qry(nod<<1|1,tm+1,tr,max(tm+1,l),r));
}

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