Cod sursa(job #701180)

Utilizator dragosnicolaeNicolae Dragos dragosnicolae Data 1 martie 2012 14:14:35
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int n,m,a[100005],s[100005][20],p[20];
FILE *f,*g;
void cit(){
	int i;
	fscanf(f,"%d%d",&n,&m);
	for(i=1;i<=n;i++)
		fscanf(f,"%d",&a[i]);
}
void pd(){
	int i,j;
	for(i=1;i<=n;i++)
		s[i][0]=i;
	for(j=1;(1<<j)<=n;j++)
		for(i=1;i+(1<<j)-1<=n;i++)
			if(a[s[i][j-1]]<a[s[i+(1<<(j-1))][j-1]])
				s[i][j]=s[i][j-1];
			else
				s[i][j]=s[i+(1<<(j-1))][j-1];
}
void putere(){
	int i;
	p[0]=1;
	for(i=1;p[i-1]*2<=100002;i++)
		p[i]=2*p[i-1];
}
void query(){
	int i,x,y,k;
	for(i=1;i<=m;i++){
		fscanf(f,"%d%d",&x,&y);
		k=(int)log2(y-x+1);
		if(a[s[x][k]]<a[s[y-p[k]+1][k]])
			fprintf(g,"%d\n",a[s[x][k]]);
		else
			fprintf(g,"%d\n",a[s[y-p[k]+1][k]]);
	}
	
}
int main(){
	f=fopen("rmq.in","r");
	g=fopen("rmq.out","w");
	cit();
	pd();
	putere();
	query();
	fclose(f);
	fclose(g);
	return 0;
}