Cod sursa(job #2527728)

Utilizator enedumitruene dumitru enedumitru Data 20 ianuarie 2020 20:34:01
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
//RMQ(Range minimum query)
//Complexitate: O(N log N + M)
#include<bits/stdc++.h>
#define min(x,y) ((x<y) ? x:y)
using namespace std;
ifstream f("rmq.in"); ofstream g("rmq.out");
int n,m,lg[100005],A[20][100005];
int main()
{	f>>n>>m;
	for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;  /// precalculam log i pentru a il putea accesa ulterior in O(1)
	for(int i=1;i<=n;i++)
		f>>A[0][i]; ///citim elementele vectorului care reprezinta prima linie a matricei ce retine dinamica
	for(int i=1;i<=lg[n];i++)
		for(int j=1;j<=n-(1<<(i-1));j++)
			A[i][j]=min(A[i-1][j],A[i-1][j+(1<<(i-1))]); ///precalculam matricea cu ajutorul recurentei obtinute
	for(int x,y,k,i=1;i<=m;i++)
	{	f>>x>>y; /// citim x si y, capetele intervalului pe care facem interogarea
		k=lg[y-x+1]; ///aflam k in O(1)
		g<<min(A[k][x],A[k][y-(1<<k)+1])<<'\n'; ///afisam minimul pe intervalul [x,y]
	}
	g.close(); return 0;
}