public class RmqSparseTable {

	int[] logTable;
	int[][] rmq;
	int[] a;

	public RmqSparseTable(int[] a) {
		this.a = a;
		int n = a.length;

		logTable = new int[n + 1];
		for (int i = 2; i <= n; i++)
			logTable[i] = logTable[i >> 1] + 1;

		rmq = new int[logTable[n] + 1][n];

		for (int i = 0; i < n; ++i)
			rmq[0][i] = i;

		for (int k = 1; (1 << k) < n; ++k) {
			for (int i = 0; i + (1 << k) <= n; i++) {
				int x = rmq[k - 1][i];
				int y = rmq[k - 1][i + (1 << k - 1)];
				rmq[k][i] = a[x] <= a[y] ? x : y;
			}
		}
	}

	public int minPos(int i, int j) {
		int k = logTable[j - i];
		int x = rmq[k][i];
		int y = rmq[k][j - (1 << k) + 1];
		return a[x] <= a[y] ? x : y;
	}

	public static void main(String[] args) {
		int[] a = { 1, 5, -2, 3 };
		RmqSparseTable st = new RmqSparseTable(a);

		System.out.println(2 == st.minPos(0, 3));
	}
}
