区域查询操作。
ma[i]:i区间内的最大值
mi[i]:i区间内的最小值
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<math.h> using namespace std; #define INF 99999999 #define lmin 1 #define rmax n #define lson l,(l+r)/2,rt<<1 #define rson (l+r)/2+1,r,rt<<1|1 #define root lmin,rmax,1 #define maxn 55000 int cl[maxn*4]; int ma[maxn*4]; int mi[maxn*4]; int num[maxn]; void push_up(int rt) { ma[rt]=max(ma[rt<<1],ma[rt<<1|1]); mi[rt]=min(mi[rt<<1],mi[rt<<1|1]); } void push_down(int rt) { if(cl[rt]!=-1) { cl[rt<<1]=cl[rt]; cl[rt<<1|1]=cl[rt]; cl[rt]=-1; } } void creat(int l,int r,int rt) { if(l==r) { scanf("%d",&cl[rt]); ma[rt]=mi[rt]=cl[rt]; return; } creat(lson); creat(rson); push_up(rt); } void update(int ll,int rr,int x,int l,int r,int rt) { if(l>rr||r<ll)return; if(ll<=l&&rr>=r) { cl[rt]+=x; return; } // push_down(rt); update(ll,rr,x,lson); update(ll,rr,x,rson); push_up(rt); } int query(int ll,int rr,int l,int r,int rt) { if(r<ll)return 0; if(l>rr)return 0; if(ll<=l&&rr>=r)return ma[rt]; return max(query(ll,rr,lson),query(ll,rr,rson)); } int query1(int ll,int rr,int l,int r,int rt) { if(r<ll)return INF; if(l>rr)return INF; if(ll<=l&&rr>=r)return mi[rt]; return min(query1(ll,rr,lson),query1(ll,rr,rson)); } int main() { int T,_,n,l,r,st,x,m; char str[110]; while(~scanf("%d%d",&n,&m)) { creat(root); while(m--) { scanf("%d%d",&l,&r); printf("%d\n",query(l,r,root)-query1(l,r,root)); } } return 0; }
poj-3264-Balanced Lineup-线段树-区域查询,布布扣,bubuko.com
poj-3264-Balanced Lineup-线段树-区域查询
原文地址:http://blog.csdn.net/rowanhaoa/article/details/26743909