Cod sursa(job #635066)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 18 noiembrie 2011 13:38:29
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
/*
rmq[x][y]=min(x->x+2^y-1);
termeni=y-x+1
l=log(termeni)
k=y-2^l+1
*/
#include<fstream>
using namespace std;
int n,m,rmq[100100][18],log_2[100100];
void make_rmq() {
	int i,j,lp;
	for(j=1;(1<<j)<=n;j++) 
		for(i=1;i+(1<<j)-1<=n;i++) {
			lp=1<<(j-1);
			rmq[i][j]=min(rmq[i][j-1],rmq[i+lp][j-1]);
			}
}
int main() {
	int i,x,y,termeni,k,lp;
	ifstream in("rmq.in");
	ofstream out("rmq.out");
	in>>n>>m;
	for(i=1;i<=n;in>>rmq[i++][0]);
	for(i=2;i<=n;i++)
		log_2[i]=log_2[i/2]+1;
	make_rmq();
	for(i=0;i<m;i++) {
		in>>x>>y;
		termeni=y-x+1;
		lp=log_2[termeni];
		k=y-(1<<lp)+1;
		out<<min(rmq[x][lp],rmq[k][lp])<<'\n';
		}
	in.close();
	out.close();
	return 0;
}