Cod sursa(job #354184)

Utilizator funkydvdIancu David Traian funkydvd Data 7 octombrie 2009 12:25:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.62 kb
#include<fstream>
#define N 1<<17
#define M 1<<5
inline int min (int x, int y)
{
	if (x<y) return x;
	return y;
}
using namespace std;
int v[N],lo[N], mat[M][N];	 
ifstream f1 ("rmq.in");
ofstream f2 ("rmq.out");
int main()
{
int n,m,a,b,i,j,p,q;
f1>>n>>m;
lo[1]=0;
for (i=1; i<=n; i++) f1>>v[i];
for (i=2; i<=n; i++) lo[i]=lo[i/2]+1;
for (i=1; i<=n; i++) mat[0][i]=v[i];
for (i=1; (1<<i)<=n; i++) 
{
p=1<<i;
q=1<<(i-1);
for (j=1; j<=n-p+1; j++) mat[i][j]=min(mat[i-1][j],mat[i-1][j+p-q]);
}
for (i=1; i<=m; i++)
{
 f1>>a>>b;
 p=lo[b-a+1];
 q=1<<p;
 f2<<min(mat[p][a],mat[p][b-q+1])<<"\n";
}
 return 0;
}