Cod sursa(job #2579777)

Utilizator MihclerioVladimir Chim Mihclerio Data 12 martie 2020 19:41:09
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

const int nmax=4e5+3;
const int inf=2e9+3;

using namespace std;

int t[nmax];

void build(int a[],int v,int st,int dr)
{
  if(st==dr) t[v]=a[st]; else
  {
    int mid=(st+dr)/2;
    build(a,v*2,st,mid);
    build(a,v*2+1,mid+1,dr);
    t[v]=min(t[v*2],t[v*2+1]);
  }
}

void update(int v,int st,int dr,int pos,int val)
{
  if(st==dr) t[v]=val; else
  {
    int mid=(st+dr)/2;
    if(pos<=mid)
    update(v*2,st,mid,pos,val); else
    update(v*2+1,mid+1,dr,pos,val);
    t[v]=min(t[v*2],t[v*2+1]);
  }
}

int get_min(int v,int st,int dr,int l,int r)
{
  if(st>r || dr<l) return inf;
  if(st>=l && dr<=r) return t[v];
  int mid=(st+dr)/2;
  return min(get_min(v*2,st,mid,l,r),get_min(v*2+1,mid+1,dr,l,r));
}

int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    freopen("rmq.in","r",stdin);
    freopen("rmq.out","w",stdout);

    int n,m;
    cin>>n>>m;
    //for(int i=0;i<nmax;i++) t[i]=inf;
    int a[n];
    for(int i=0;i<n;i++) cin>>a[i];
    build(a,1,0,n-1);
    for(int i=0;i<m;i++)
    {
      int a,b;
      cin>>a>>b;
      cout<<get_min(1,0,n-1,a-1,b-1)<<"\n";
    }

}