Cod sursa(job #154184)

Utilizator blasterzMircea Dima blasterz Data 10 martie 2008 22:57:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <string>
#include <cmath>
#define maxn 100001
#define maxlg 20

int dp[maxlg][maxn];
int lg[maxn];
int n,m;

inline int min(int a, int b)
{
	if(a<b) return a;
	return b;
}

void read()
{
	freopen("rmq.in","r",stdin);
	scanf("%d %d\n", &n, &m);
	int i;
	for(i=1;i<=n;++i) scanf("%d ", &dp[0][i]);
//	for(i=1;i<=n;++i)printf("%d ", dp[0][i]);
	//printf("\n");
}

void solve()
{
	int i, j, cnt;
	
	for(i=1;i<20;++i)
		for(j=1;j+(1<<i)-1<=n;++j)
			dp[i][j]=min(dp[i-1][j], dp[i-1][j+(1<<(i-1))]);
		
	for(i=1;i<=n;++i) lg[i]=(int)log2((double)i);

	
	//for(i=1;i<=n;++i) printf("%d ", dp[1][i]);
//	printf("\n");
}

inline int query(int a, int b)
{
	int p=lg[b-a];
//	printf("%d_\n", p);
	return min(dp[p][a],dp[p][b-(1<<p)+1]);
}


int main()
{
	freopen("rmq.out","w",stdout);
	read();
	solve();
	int p, q;
	char ax[64], *t;
	while(m--)
	{
		gets(ax);
		t=strtok(ax, " ");
		p=atoi(t);
		t=strtok(0, " \n");
		q=atoi(t);
		//scanf("%d %d\n", &p, &q);
		printf("%d\n", query(p, q));
		
	}
	
	return 0;
}