Topic links
The difference between the maximal value and the minimum value of the corresponding interval is obtained.
#include <stdio.h>#include<string.h>#include<algorithm>#include<iostream>#defineINF 0XFFFFFFF#defineN 50010using namespacestd;#defineLson r<<1#defineRson r<<1|1structsegtree{intL, R, Min, Max; intmid () {return(l+r) >>1; }}a[n*4];intMin,max;voidBuildsegtree (intRintLintR) {A[r]. L= L, A[r]. R =R; if(L = =R) {scanf ("%d", &A[r]. MAX); A[R]. Min=A[r]. Max; return; } buildsegtree (Lson, L, A[r].mid ()); Buildsegtree (Rson, A[r].mid ()+1, R); A[R]. Max=Max (A[rson]. Max, A[lson]. MAX); A[R]. Min=min (A[rson]. Min, A[lson]. Min); //A[r].ans = A[r]. MAX-A[R]. Min;}voidQuery (intRintLintR) { if(A[r]. L = = L && a[r]. R = =R) {MAX=Max (Max, A[r]. MAX); MIN=min (min, a[r]. Min); return ; } if(l>A[r].mid ()) Query (Rson, L, R); Else if(R <=A[r].mid ()) Query (Lson, L, R); Else{Query (Lson, L, A[r].mid ()); Query (Rson, A[r].mid ()+1, R); }}intMain () {intN, M, L, R; while(SCANF ("%d%d", &n, &m)! =EOF) {Buildsegtree (1,1, N); while(m--) {MIN=INF; MAX=-1; scanf ("%d%d", &L,&R); Query (1, L, R); printf ("%d\n", max-MIN); } } return 0;}
View Code
Balanced Lineup---poj3264 Segment Tree Foundation