题目链接如下所示:
简单的二维线段树裸题辣。
可以这样看,一个节点不再只代表单个区间,而是代表了两个区间,我们在update的时候,pushup的操作变成了,我们要不断更新所有不同x区间和y区间的节点,当然,这个节点是要把update的坐标包含在内的。
同样query也需要在两个维度上进行query,先锁定x,再锁定y。
具体代码如下所示:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
#include<cstring>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<cmath>
#include<climits>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int n,s[1005][4005];
void sub_build(int xrt,int l,int r,int rt){
s[xrt][rt]=-1;
if (l==r){
return;
}
int mid=(l+r)>>1;
sub_build(xrt,lson);
sub_build(xrt,rson);
}
void build(int l,int r,int rt){
sub_build(rt,0,n,1);
if (l==r) return;
int mid=(l+r)>>1;
build(lson);
build(rson);
}
void sub_update(int xrt,int y,int c,int l,int r,int rt){
if (l==r && l==y) {
s[xrt][rt]=max(s[xrt][rt],c);
return;
}
int mid=(l+r)>>1;
if (y<=mid){
sub_update(xrt,y,c,lson);
} else{
sub_update(xrt,y,c,rson);
}
s[xrt][rt]=max(s[xrt][rt<<1],s[xrt][rt<<1|1]);
}
void update(int x,int y,int c,int l,int r,int rt){
sub_update(rt,y,c,0,n,1);
if (l==r) return;
int mid=(l+r)>>1;
if (x<=mid) update(x,y,c,lson);
else update(x,y,c,rson);
}
int sub_query(int xrt,int yl,int yr,int l,int r,int rt){
if (yl<=l && r<=yr) return s[xrt][rt];
int mid=(l+r)>>1;
int res=-1;
if (yl<=mid){
res= max(res, sub_query(xrt,yl,yr,lson));
}
if (yr>mid){
res= max(res, sub_query(xrt,yl,yr,rson));
}
return res;
}
int query(int xl,int xr,int yl,int yr,int l,int r,int rt){
if (xl<=l && r<=xr) return sub_query(rt,yl,yr,0,n,1);
int mid=(l+r)>>1;
int res=-1;
if (xl<=mid){
res= max(res, query(xl,xr,yl,yr,lson));
}
if (xr>mid){
res= max(res, query(xl,xr,yl,yr,rson));
}
return res;
}
int main(){
int m,a,b;
double c,d;
char op[2];
while (scanf("%d",&m) && m){
n=1000;
build(100,200,1);
for (int i = 0; i < m; ++i) {
scanf("%s",op);
if (op[0]=='I'){
scanf("%d %lf %lf",&a,&c,&d);
update(a,c*10,d*10,100,200,1);
} else{
scanf("%d %d %lf %lf",&a,&b,&c,&d);
int cc=c*10,dd=d*10;
if (a>b) swap(a,b);
if (cc>dd) swap(cc,dd);
int ans= query(a,b,cc,dd,100,200,1);
if (ans==-1){
printf("-1\n");
} else{
printf("%.1lf\n",ans/10.0);
}
}
}
}
return 0;
}