Cod sursa(job #1083963)

Utilizator mihai.cuculiciCuculici Mihail mihai.cuculici Data 16 ianuarie 2014 16:12:39
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define NMAX 100010
#define MIN(a,b) ((a<b)?a:b)
using namespace std;

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()
{
    ifstream f ("rmq.in");
    ofstream g ("rmq.out");
    long N, M, i, j, x, y, l, v[NMAX];

    f>>N>>M;

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