Cod sursa(job #1083864)

Utilizator mihai.cuculiciCuculici Mihail mihai.cuculici Data 16 ianuarie 2014 15:15:00
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <fstream>
#define NMAX 100010
#define MIN(a,b) ((a<b)?a:b)
using namespace std;
 
ifstream f ("rmq.in");
ofstream g ("rmq.out");

void rmq_initialize(long node, int lo, int hi, long* m, long* v){ // initialize the segment tree
  if (lo >= hi) m[node] = lo;
  else{
    rmq_initialize(node * 2, lo, (lo+hi) / 2, m, v);
    rmq_initialize(node * 2+1, (lo+hi) / 2 + 1, hi, m, v);

    if (v[m[2 * node]] <= v[m[2 * node + 1]])
      m[node] = m[2 * node];
    else
      m[node] = m[2 * node + 1];
  }
}

long rmq_query(long node, int lo, int hi, long* m, long* v, int i, int j){
  int p1, p2;
  if (i > hi || j < lo) return -1;
  if (lo >= i && hi <= j) return m[node];
  p1 = rmq_query(2 * node, lo, (lo+hi) / 2, m, v, i, j);
  p2 = rmq_query(2 * node+1, (lo+hi) / 2 + 1, hi, m, v, i, j);
  if (p1 == -1) return /*m[node] = */p2;
  if (p2 == -1) return /*m[node] = */p1;
  if (v[p1] <= v[p2]) return /*m[node] = */p1;
  return /*m[node] = */p2;
}

int main()
{
    long N, M, i, j, x, y, v[NMAX], m[NMAX];
    f>>N>>M;
    for(i=0;i<N;i++) f>>v[i];

    rmq_initialize(1, 0, N, m, v);
    for(j=1;j<=M;j++)  
    {
       f>>x>>y;
       g<<v[rmq_query(1, 0, N, m, v, x-1, y-1)]<<"\n";              
    }  
    f.close();
    g.close();
    return 0;
}