Cod sursa(job #1801343)

Utilizator al_k_ponyClaudiu Babin al_k_pony Data 8 noiembrie 2016 21:57:28
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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>
#define vll     vector<long long>
using namespace std;

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

void upd(int nod,int l, int r, int val)
{
    if(l == r)
    {
        aint[nod] = val;
        return;
    }
    int mid = (l+r)/2;
    if(pos<=mid) upd(nod<<1,l,mid,val);
    else upd(nod<<1|1,mid+1,r,val);
    aint[nod] = min(aint[nod<<1],aint[nod<<1|1]);
}

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


int main(){
_
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);
    memset(aint,inf,sizeof(aint));
    scanf("%d %d",&n,&m);
    for(int i = 1;i<=n;i++)
    {
        scanf("%d",&x);
        pos = i;
        upd(1,1,n,x);
    }
    for(int i = 1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        start = x;
        finish = y;
        printf("%d\n",qry(1,1,n));
    }
    return 0;
}