Cod sursa(job #917183)

Utilizator taigi100Cazacu Robert taigi100 Data 17 martie 2013 14:02:04
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
int n,k,v[100],rmq[100];
int minpos;
 int find(int i,int j,int left,int right,int node)
{
	int first,last;
	if( i>right || j<left)
		return -1;
	if( left>=i && right<=j)
	{
		if(v[rmq[node]]<v[minpos])
			minpos=rmq[node];
		return rmq[node];
	}

	first=find(i,j,left,(left+right)/2,node*2);
	last=find(i,j,(left+right)/2+1,right,node*2+1);

	if(first==-1)
		return last;
	if (last==-1)
		return first;
	if(v[first]<=v[last])
		return first;
	return last;
}
void preprocess_rmq(int left,int right,int node)
{
	if(left==right)
		rmq[node]=left;
	else
	{
	//meri la copi.
	 preprocess_rmq(left,(left+right)/2,2*node);
	 preprocess_rmq((left+right)/2+1,right,2*node+1);

	 if(v[rmq[2*node]]<=v[rmq[2*node+1]])
		 rmq[node]=rmq[2*node];
	 else
		 rmq[node]=rmq[2*node+1];
	}
 }
int main()
{
    freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);

	scanf("%d %d",&n,&k);

	for(int i=1;i<=n;i++) scanf("%d",&v[i]);
		for(int i=1;i<=n;i++)
		rmq[i]=-1;
	preprocess_rmq(1,n,1);
	v[0]=20000000;
	for(int i=1;i<=k;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);
		minpos=0;
		int aux=find(x,y,1,n,1);
		printf("%d\n",v[minpos]);
	}
}