int a[100010]; int st1[100010][25];//st表 int st2[100010][25];//st表 void init(int n){ for (int i = 0; i < n; i++){ st1[i][0] = a[i + 1]; st2[i][0] = a[i + 1]; } for (int i = 1; (1 << i) <= n; i++){ for (int j = 0; j + (1 << i) - 1 < n; j++){ st1[j][i] = max(st1[j][i - 1], st1[j + (1 << (i - 1))][i - 1]); st2[j][i] = min(st2[j][i - 1], st2[j + (1 << (i - 1))][i - 1]); } } } int querysmax(int l, int r){ l--; r--; int k = (int)(log((double)(r - l + 1)) / log(2.0)); return max(st1[l][k], st1[r - (1 << k) + 1][k]); } int queryemin(int l, int r){ l--; r--; int k = (int)(log((double)(r - l + 1)) / log(2.0)); return min(st2[l][k], st2[r - (1 << k) + 1][k]); }