Cod sursa(job #379205)

Utilizator GotenAmza Catalin Goten Data 30 decembrie 2009 22:54:27
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.64 kb
#include<fstream.h>
#include<iostream.h>

int n,mm,i,a[100009],lo,lg[100009],x,y,j,m[20][1000009],l;

int main()
{
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	f>>n>>mm;
	for(i=1;i<=n;i++)
		f>>a[i];
	lg[1]=0;
	for(i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	for(i=1;i<=n;i++)
		m[0][i]=i;
	for(j=1;j<=lg[n];j++)
		for(i=1;j<=lg[n-i+1];i++)
			if(a[m[j-1][i]]<a[m[j-1][i+(1<<(j-1))]])
				m[j][i]=m[j-1][i];
			else
				m[j][i]=m[j-1][i+(1<<(j-1))];
	for(i=1;i<=mm;i++)
	{
		f>>x>>y;
		l=y-x+1;
		lo=lg[l];
		if(a[m[lo][x]]<a[m[lo][y-(1<<lo)+1]])
			g<<a[m[lo][x]]<<'\n';
		else
			g<<a[m[lo][y-(1<<lo)+1]]<<'\n';
	}
	return 0;
}