Lang:G++
Edit12345678910111213141516171819202122232425262728293031#include <stdio.h>#include <math.h>#include <iostream>#include <algorithm>#include <queue>#include <map>#include <set>#include <vector>using namespace std;int T;int n[100005];int d_min[100005][20];int d_max[100005][20];void RMQ_init(){for(int i = 1; i <= T; ++i) {d_min[i][0] = i;d_max[i][0] = i;}for(int j = 1; (1<<(j)) <= T; ++j) {for(int i = 1; i + (1<<j) - 1 <= T; ++i){d_min[i][j] = n[d_min[i][j-1]] < n[d_min[i+(1<<(j-1))][j-1]] ? d_min[i][j-1] : d_min[i+(1<<(j-1))][j-1];d_max[i][j] = n[d_max[i][j-1]] > n[d_max[i+(1<<(j-1))][j-1]] ? d_max[i][j-1] : d_max[i+(1<<(j-1))][j-1];//printf("start %d length %d max %d min %d\n", i, 1 << j, d_max[i][j], d_min[i][j]);//printf("i %d j %d T %d i + (1<<(j-1)) %d\n", i, j, T, i + (1<<(j-1)));}}