Cod sursa(job #1281631)

Utilizator hellol30FMI Macovei Daniel hellol30 Data 3 decembrie 2014 15:24:49
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int a[100001];
int d[21][100001];
int lg[100001];
int main(){
	freopen("rmq.in","rt",stdin);
	int n,m;
	scanf("%d%d",&n,&m);

	for (int i = 1; i <= n; i++) 
		scanf("%d", &a[i]);
	lg[1]=0;
	for (int i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
	for (int i=1;i<=n;i++)
		d[0][i]=a[i];
	for (int i=1; (1 << i) <=n;i++)
		for (int j=1;j <= n - (1 << i)+1;j++) {
			int l=1<<(i-1);
			d[i][j]= min( d[i-1][j] , d[i-1][j+l] );
		}
	int x,y,diferenta,log,shifted;
	freopen("rmq.out","wt",stdout);
	for (int i = 0; i < m; i++) {
		scanf("%d%d", &x, &y);
		diferenta=y-x+1;
		log=lg[diferenta];
		shifted=diferenta - (1<<log);
		printf("%d\n",min(d[log][x],d[log][x+shifted]) );
	}
}