POJ 3264 Balanced Lineup

来源:互联网 发布:心做し背后故事 知乎 编辑:程序博客网 时间:2024/05/16 17:51

大意略。

#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>using namespace std;const int maxn = 50010;const int maxd = 17; // log10(50010) / log10(2);int n, m;int A[maxn];int minv[maxn][maxd], maxv[maxn][maxd];void RMQ_init(){for(int i = 1; i <= n; i++){minv[i][0] = A[i];maxv[i][0] = A[i];}for(int j = 1; (1<<j) <= n; j++){for(int i = 1 ; i+(1<<j)-1 <= n; i++){minv[i][j] = min(minv[i][j-1], minv[i+(1<<(j-1))][j-1]);maxv[i][j] = max(maxv[i][j-1], maxv[i+(1<<(j-1))][j-1]);}}}int RMQ(int L, int R){int k = 0;while(1<<(k+1) <= R-L+1) k++;int a = min(minv[L][k], minv[R-(1<<k)+1][k]);int b = max(maxv[L][k], maxv[R-(1<<k)+1][k]);return b-a;}void read_case(){for(int i = 1; i <= n; i++) scanf("%d", &A[i]);RMQ_init();}void solve(){read_case();while(m--){int L, R;scanf("%d%d", &L, &R);int ans = RMQ(L, R);printf("%d\n", ans);}}int main(){while(~scanf("%d%d", &n, &m)){solve();}return 0;}


原创粉丝点击