Cod sursa(job #691693)

Utilizator federerUAIC-Padurariu-Cristian federer Data 26 februarie 2012 12:40:29
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#define Nmax 100001
using namespace std;

int A[Nmax], M[Nmax], dmax, h, n, m, i;

int creatArb (int nod, int st, int dr)
{
	int mijl=(st+dr)/2;
	if(st==dr)
	{
		M[nod]=st;
		return st;
	}
	int pozst, pozdr;
	pozst=creatArb(2*nod, st, mijl);
	pozdr=creatArb(2*nod+1, mijl+1, dr);
	if(A[pozdr]>A[pozst])
		M[nod]=pozst;
	else
		M[nod]=pozdr;
	return M[nod];
}
int Q(int nod, int st, int dr, int x, int y)
{
  if(dr<x || y<st)
    return -1;
  if(x<=st && dr<=y)
    return M[nod];
  int pozst, pozdr;
  int mijl=(st+dr)/2;
    pozst=Q(2*nod, st, mijl, x, y);
    pozdr=Q(2*nod+1, mijl+1, dr, x, y);
    if(pozst==-1) return pozdr;
    if(pozdr==-1) return pozst;
    if(A[pozst]>A[pozdr])
      return pozdr;
    return pozst;
  
}
int main()
{
	int a, b;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i=1;i<=n;++i)
		scanf("%d", &A[i]);
	dmax=1,h=1;
	while(dmax<=n)
		dmax*=2,h++;
	dmax*=2;
	for(i=1;i<=dmax;++i)
		M[i]=-1;
	creatArb(1, 1, n);
	for(i=1;i<=m;++i)
	{
		scanf("%d%d", &a, &b);
		printf("%d\n", A[Q(1, 1, n, a, b)]);
	}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}