Cod sursa(job #2515024)

Utilizator 1chiriacOctavian Neculau 1chiriac Data 27 decembrie 2019 17:14:02
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>

using namespace std;
int n,m,v[100005],rmq[20][100005],st,dr,lg[100005];
void build_rmq () {
	for(int i=1;i<=n;++i)
		rmq[0][i]=v[i];
	for(int j=1;(1<<j)<=n;++j)
		for(int i=1;i+(1<<j)-1<=n;++i)
			rmq[j][i]=min(rmq[j-1][i],rmq[j-1][i+(1<<(j-1))]);
}
int querrys (int st,int dr) {
	return min(rmq[lg[dr-st+1]][st],rmq[lg[dr-st+1]][1+dr-(1<<lg[dr-st+1])]);
}
int main () {
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	//rmq[i][j]=min pe interval de putere 2,j care incepe in i;
	//i,j este intervalul i,i+(1<<j)-1;
	scanf("%d%d", &n, &m);++m;
	for(int i=1;i<=n;++i)
		scanf("%d", &v[i]);
	for(int i=2;i<=n;++i)
		lg[i]=lg[(i>>1)]+1;
	build_rmq();
	while(--m) {
		scanf("%d%d", &st, &dr);
		printf("%d\n", querrys(st,dr));
	}
	/*for(int i=0;i<=lg[n];++i,printf("\n"))
		for(int j=1;j<=n;++j)
			printf("%d ", rmq[i][j]);*/
	return 0;
}