首页 > 代码库 > poj-3264-Balanced Lineup-线段树-区域查询
poj-3264-Balanced Lineup-线段树-区域查询
区域查询操作。
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。