poj 3264
题意:给你一组值,然后询问某个区间的最大值和最小值之差
分析:因为没有更新,所以只需要查找即可,节点保存一个最大值最小值就行了
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<ctype.h> #include<queue> #include<stack> #include<math.h> #include<vector> #include<stdlib.h> using namespace std; #define INF 0xfffffff #define Lson rt<<1 #define Rson rt<<1|1 #define N 50010 struct node { int L, R, mid; int x, y; }a[N<<2]; int Max, Min, b[N]; void buildsegtree(int rt, int L, int R); void query(int rt, int L, int R); int main() { int n, m, i, j; scanf("%d%d", &n, &m); for(int k=1; k<=n; k++) scanf("%d", &b[k]); buildsegtree(1, 1, n); while(m--) { Max=-INF; Min=INF; scanf("%d%d", &i, &j); query(1, i, j); printf("%d\n", Max-Min); } } void buildsegtree(int rt, int L, int R) { a[rt].L=L; a[rt].R=R; a[rt].mid=(L+R)>>1; if(L==R) { a[rt].x=a[rt].y=b[L]; return; } buildsegtree(Lson, L, a[rt].mid); buildsegtree(Rson, a[rt].mid+1, R); a[rt].x=min(a[Lson].x, a[Rson].x); a[rt].y=max(a[Lson].y, a[Rson].y); } void query(int rt, int L, int R) { if(a[rt].L==L&&a[rt].R==R) { Max=max(a[rt].y, Max); Min=min(a[rt].x, Min); return; } if(R<=a[rt].mid) query(Lson, L, R); else if(a[rt].mid<L) query(Rson, L, R); else { query(Lson, L, a[rt].mid); query(Rson, a[rt].mid+1, R); } }