Cod sursa(job #290258)

Utilizator snaked31Stanica Andrei snaked31 Data 27 martie 2009 18:17:27
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>

#define nm 100002
#define mm 18

int v[nm];
int a[nm][mm];
int n, m, i, x, y, j, k;

inline int mn (int a, int b) { return (a < b ? a : b); }


int rmq(int x, int y)

{
	int z = (y-x+1);
	int k = 0, p = 1;
	while (p <= z)
	{
		++k;
		p *= 2;
	}
	--k;

	return (mn ( v[a[x][k]], v[a[y-(1 << k)+1][k]] ));
}


void read()

{
	scanf("%d %d ", &n, &m);

	for (i=1; i<=n; ++i)
	{
		scanf("%d ", &v[i]);
		a[i][0] = i;

	}

	for (j=1; 1 << j <=n; ++j)
	{
		for (i=1; (i + (1 << j) - 1 )<=n; ++i)
		{
			if (v[a[i][j-1]] < v[a[i + (1 << (j-1))][j-1]])
				a[i][j] = a[i][j-1];
			else
				a[i][j] = a[i + (1 << (j-1))][j-1];
			/*k = (1 << (j-1));
			if (v[a[i][j-1]] < v[a[i + k][j-1]])
				a[i][j] = a[i][j-1];
			else
				a[i][j] = a[i + k][j-1];*/
		}
	}

}


void solve()

{
	for (i=1; i<=m; ++i)
	{
		scanf("%d %d ", &x, &y);
		printf("%d\n", rmq(x, y));
	}

}


void write()

{

}


int main()

{
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out","w",stdout);

	read();
	solve();
	write();


	return 0;
}