Cod sursa(job #1147197)

Utilizator ionutzzu12ioan maracineanu ionutzzu12 Data 19 martie 2014 17:32:09
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in ("rmq.in");
ofstream out ("rmq.out");

int N,M,a[100001],m[200001],s,d;

void arbore(int nod,int st,int dr)
{
    if (st==dr) m[nod]=st;
    else
    {
        arbore (2*nod,st,(st+dr)/2); arbore (2*nod+1,(st+dr)/2+1,dr);
        if (a[m[2*nod]]<a[m[2*nod+1]]) m[nod]=m[2*nod];
        else m[nod]=m[2*nod+1];
    }
}

int rmq(int nod, int st,int dr)
{
    if (s>dr||st>d) return -1;
    if (s<=st&&dr<=d) return m[nod];
    int p1,p2;
    p1=rmq(2*nod,st,(st+dr)/2);
    p2=rmq(2*nod+1,(st+dr)/2+1,dr);
    if (p1 == -1)
          return p2;
      if (p2 == -1)
          return p1;
      if (a[p1] <= a[p2])
          return p1;
      return p2;
}
int main()
{
    in>>N>>M;
    int i;
    for (i=0;i<N;i++) in>>a[i];
    arbore(1,0,N-1);

    for (i=1;i<=M;i++)
    {
        in>>s>>d; s--; d--;
        out<<a[rmq(1,0,N-1)]<<endl;
    }
    return 0;
}