POJ3264 Balanced Lineup

2014-11-23 20:00:45 · 作者: · 浏览: 4
#include 
#include 
#include 
#include 
#include 
#include 
//	Accepted	4868K	3016MS	C++	2390B	2013-08-09 12:45:26
//  Accepted	5392K	4844MS	G++	2390B	2013-08-09 12:44:44

using namespace std;
const int maxn = 50100;
const int INF = 0x7fffffff;
struct Node {
    int Left, Right;
    int maxval, minxval;
    Node *LeftChild, *RightChild;
    Node() {
        maxval = -1;//保证插入时候更新不会出错。
        minxval = INF;
    }
};
int ql, qr;//全局变量,即每次插入或查询区间。
int Min, Max;//保存要查询区间的最值.
int n, m;
Node *root = NULL;

void Build(Node* cur, int L, int R) {
    cur->Left = L;
    cur->Right = R;
    if(L != R) {
        cur->LeftChild = new Node;
        cur->RightChild = new Node;
        Build(cur->LeftChild, L, (L+R)/2);
        Build(cur->RightChild, (L+R)/2+1, R);
    }
    else {//L == R
        cur->LeftChild = NULL;//没有左右孩子。
        cur->RightChild = NULL;
    }
}
//插入时候每次给ql赋值.
void update(Node* cur, int L, int R, int value) {
    if(L==R && L == ql) { //叶子节点。
        cur->maxval = value;
        cur->minxval = value;
        return;
    }
    Node* LC = cur->LeftChild;
    Node* RC = cur->
RightChild; int M = (L+R)/2; if(ql <= M) update(LC, L, M, value); else update(RC, M+1, R, value); cur->maxval = max(LC->maxval, RC->maxval); cur->minxval = min(LC->minxval, RC->minxval); } //区间:[ql, qr], Min, Max 全局变量, 进行初始化。 void query(Node* cur, int L, int R) { if(ql <= L && R <= qr) { Min = min(Min, cur->minxval); Max = max(Max, cur->maxval); return; } Node* LC = cur->LeftChild; Node* RC = cur->RightChild; int M = (L+R)/2; if(ql <= M) query(LC, L, M); if(qr > M) query(RC, M+1, R); return; } void init(){ int tmp; Max = -1;//littl, import; Min = 10000000;//big Build(root, 1, n); for(int i = 1; i <= n; i++) { scanf("%d", &tmp); ql = i; update(root, 1, n, tmp); } } int main() { int start, endx; while(scanf("%d%d", &n, &m) != EOF) { root = new Node; init(); for(int i = 1; i <= m; i++) { scanf("%d%d", &start, &endx); ql = start, qr = endx; Max = -1, Min = INF; query(root, 1, n); int res = Max - Min; printf("%d\n", res); } } return 0; }