Cod sursa(job #1234704)

Utilizator PTAdrian64Pop-Tifrea Adrian PTAdrian64 Data 27 septembrie 2014 20:57:53
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>
#define n_max 400090
#include <algorithm>
#define mv 1000000

using namespace std;
int n,m;
int a[n_max];
int vl,ps,mxm,st,fh;

inline int md(int l,int r){
  return l+(r-l)/2;
}

inline int first_sun(int node){
  return node<<1;
}

inline int second_sun(int node){
  return (node<<1)^1; 
}

void update(int node,int l,int r){
 if(l==r){
      a[node]=vl;
      return;
    }
 int mid=md(l,r);
 if(ps<=mid)
    update(first_sun(node),l,mid);
 else
    update(second_sun(node),mid+1,r);
 a[node]=min(a[first_sun(node)],a[second_sun(node)]);
}
void read(int n){
  for(int i=1,x;i<=n ;++i){
    scanf("%d",&x);
    vl=x;
    ps=i;
    update(1,1,n);
  } 
}

void search(int node,int l,int r){
  if(st <= l && fh>= r){
     mxm=min(mxm,a[node]);
     return;
  }
  int mid=md(l,r);
  if(st<=mid)
      search(first_sun(node),l,mid);
  if(mid < fh)
      search(second_sun(node),mid+1,r);
  
}

int main(void){
  freopen("rmq.in", "r",stdin);
  freopen("rmq.out","w",stdout);
  scanf("%d %d",&n,&m);
  read(n);
  int x,y;
  while(m--){
     scanf("%d%d",&x,&y);
     mxm=mv;
     st=x;fh=y;
     search(1,1,n);
     printf("%d\n",mxm); 
  }
}