Cod sursa(job #2096769)

Utilizator DragosBledeaDragos Bledea DragosBledea Data 29 decembrie 2017 18:51:43
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <iostream>
using namespace std;
ifstream fi("rmq.in");
ofstream fo("rmq.out");
int N,A[100001];
int M;
int LG[100001];
int p,k;
int Table[100001][18];

int main()
{
	fi>>N>>M;
	for (int i=1;i<=N;i++)
		fi>>A[i];
	/// se construieste sirul LG
	LG[1]=1;
	p=1;
	k=1;
	while (2*p<=N)
	{
		LG[2*p]=k+1;
		p=p*2;
		k++;
	}
	for (int i=1;i<=N;i++)
		if (LG[i]==0)
			LG[i]=LG[i-1];
	for (int i=1;i<=N;i++)
		LG[i]--;
	/// se construieste Table
	for (int i=1;i<=N;i++)
		Table[i][0]=A[i];
	k--;
	for (int j=1;j<=k;j++)
		for (int i=1;i<=N-(1<<j)+1;i++)
			Table[i][j]=min(Table[i][j-1],Table[i+(1<<(j-1))][j-1]);
	/// se citesc intrebarile si se raspunde la fiecare din ele
	for (int q=1;q<=M;q++)
	{
		int st,dr,lung,length,rezst,rezdr;
		fi>>st>>dr;
		lung=dr-st+1;
		length=1<<LG[lung];
		rezst=Table[st][LG[lung]];
		rezdr=Table[dr-length+1][LG[lung]];
		fo<<min(rezst,rezdr)<<"\n";
	}
	fi.close();
	fo.close();
	return 0;
}