思路:二维线段树求区域最值。值得注意的是在进行Q操作时可能H1>H2,A1>A2.所以要swap.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define lson l,m,rt<<1 5 #define rson m+1,r,rt<<1|1 6 #define maxn1 1002 7 #define maxn2 102 8 struct node 9 { 10 int subsetree[maxn1*3]; 11 }setree[maxn2*3]; 12 void subbuild(int num,int l,int r,int rt) 13 { 14 setree[num].subsetree[rt]=-1; 15 if(l==r) 16 return; 17 int m=(l+r)>>1; 18 subbuild(num,lson); 19 subbuild(num,rson); 20 } 21 void build(int l,int r,int rt) 22 { 23 subbuild(rt,0,1000,1); 24 if(l==r) 25 return; 26 int m=(l+r)>>1; 27 build(lson); 28 build(rson); 29 } 30 void subupdate(int num,int l,int r,int rt,int l2,int c) 31 { 32 if(l==r){ 33 setree[num].subsetree[rt]=max(setree[num].subsetree[rt],c); 34 return; 35 } 36 int m=(l+r)>>1; 37 if(l2<=m) 38 subupdate(num,lson,l2,c); 39 else if(l2>m) 40 subupdate(num,rson,l2,c); 41 setree[num].subsetree[rt]=max(setree[num].subsetree[rt<<1],setree[num].subsetree[rt<<1|1]); 42 } 43 void update(int l,int r,int rt,int l1,int l2,int c) 44 { 45 subupdate(rt,0,1000,1,l2,c); 46 if(l==r) 47 return; 48 int m=(l+r)>>1; 49 if(l1<=m) 50 update(lson,l1,l2,c); 51 else if(l1>m) 52 update(rson,l1,l2,c); 53 } 54 int subquery(int num,int l,int r,int rt,int l2,int r2) 55 { 56 if(l2<=l&&r<=r2) 57 return setree[num].subsetree[rt]; 58 int m=(l+r)>>1; 59 int ans=-1; 60 if(l2<=m) 61 ans=max(ans,subquery(num,lson,l2,r2)); 62 if(r2>m) 63 ans=max(ans,subquery(num,rson,l2,r2)); 64 return ans; 65 } 66 int query(int l,int r,int rt,int l1,int r1,int l2,int r2) 67 { 68 if(l1<=l&&r<=r1) 69 return subquery(rt,0,1000,1,l2,r2); 70 int m=(l+r)>>1; 71 int ans=-1; 72 if(l1<=m) 73 ans=max(ans,query(lson,l1,r1,l2,r2)); 74 if(r1>m) 75 ans=max(ans,query(rson,l1,r1,l2,r2)); 76 return ans; 77 } 78 int main() 79 { 80 int n; 81 while(scanf("%d",&n)&&n){ 82 build(100,200,1); 83 while(n--){ 84 char s[5]; 85 scanf("%s",s); 86 if(s[0]=='I'){ 87 double a,l; 88 int l1; 89 scanf("%d%lf%lf",&l1,&a,&l); 90 int l2=int(a*10),c=int(l*10); 91 update(100,200,1,l1,l2,c); 92 } 93 else if(s[0]=='Q'){ 94 double l2,r2; 95 int l1,r1; 96 scanf("%d%d%lf%lf",&l1,&r1,&l2,&r2); 97 int ll2=int(10*l2),rr2=int(10*r2); 98 if(l1>r1)swap(l1,r1); 99 if(ll2>rr2)swap(ll2,rr2); 100 int ans=query(100,200,1,l1,r1,ll2,rr2); 101 if(ans==-1) 102 printf("-1\n"); 103 else 104 printf("%.1lf\n",ans/10.0); 105 } 106 } 107 } 108 return 0; 109 }