Cod sursa(job #1887851)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 21 februarie 2017 19:52:13
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");
int N,M,rmq[100010][220];

int main(){
	fin >>N>>M;
	for (int i=0;i<N;i++){
		fin >>rmq[i][0];
	
	}
	
	for (int j=1;(1<<j)<=N;j++){
		for (int i=0;i+(1<<(j))-1<N;i++){
			rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
			
		}
	}
	
	/*
	for (int j=0;(1<<j)<=N;j++){
		for (int i=0;i+(1<<(j))-1<N;i++){
			//rmq[i][j]=min(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
			cout <<rmq[i][j]<<" ";
		}
		cout <<endl;
	}
	
	*/
	for (int i=0;i<M;i++){
		int x,y,l,k;
		fin >>x>>y;
		x--;y--;
		l=y-x+1;
		k=int(log2(l));
		int dif=l-(1<<k);
		//fout <<l<<" "<<k<<" ";
		//cout <<rmq[x][k]<<" "<<rmq[x+(1<<(k))-1][l-(1<<(k))]<<endl;
		fout <<min(rmq[x][k],rmq[x+dif][k])<<"\n";
		
	}
	return 0;
	
}