#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<cmath>
#define MAX 101
#define L(x) (x<<1)
#define R(x) (x<<1|1)
using namespace std;
class subnode
{
public:
int l,r;
double val;
subnode(){};
subnode(int a,int b):l(a),r(b)
{}
void set(int a,int b)
{
l=a;
r=b;
}
bool leaf()
{
return l==r;
}
int mid()
{
return (l+r)>>1;
}
bool cover(int a,int b)
{
if(a<=l&&r<=b)
return true;
return false;
}
};
class node
{
public:
int l,r;
subnode sub[MAX*10*3];
node(){};
node(int a,int b):l(a),r(b)
{}
void set(int a,int b)
{
l=a;
r=b;
}
bool leaf()
{
return l==r;
}
int mid()
{
return (l+r)>>1;
}
bool cover(int a,int b)
{
if(l>=a&&r<=b)
return true;
return false;
}
}a[MAX*3];
void subbuild(int t,int f,int l,int r)
{
a[t].sub[f].set(l,r);
a[t].sub[f].val=-1;
if(l==r)
return;
int mid=(l+r)>>1;
subbuild(t,L(f),l,mid);
subbuild(t,R(f),mid+1,r);
}
void build(int t,int x1,int x2,int y1,int y2)
{
a[t].set(x1,x2);
subbuild(t,1,y1,y2);
if(x1==x2)
return;
int mid=(x1+x2)>>1;
build(L(t),x1,mid,y1,y2);
build(R(t),mid+1,x2,y1,y2);
}
void subupdate(int t,int f,int l,int r,double val)
{
a[t].sub[f].val=max(a[t].sub[f].val,val);
if(a[t].sub[f].leaf())
return;
int mid=a[t].sub[f].mid();
if(l<=mid)
subupdate(t,L(f),l,r,val);
if(r>mid)
subupdate(t,R(f),l,r,val);
}
void update(int t,int x1,int x2,int y1,int y2,double val)
{
subupdate(t,1,y1,y2,val);
if(a[t].leaf())
return ;
int mid=a[t].mid();
if(x1<=mid)
update(L(t),x1,x2,y1,y2,val);
if(x2>mid)
update(R(t),x1,x2,y1,y2,val);
}
double subquery(int t,int f,int l,int r)
{
if(a[t].sub[f].cover(l,r))
return a[t].sub[f].val;
if(a[t].sub[f].leaf())return -1;
int mid=a[t].sub[f].mid();
double ans=-1;
if(l<=mid)
ans=max(ans,subquery(t,L(f),l,r));
if(r>mid)
ans=max(ans,subquery(t,R(f),l,r));
return ans;
}
double query(int t,int x1,int x2,int y1,int y2)
{
if(a[t].cover(x1,x2))
return subquery(t,1,y1,y2);
if(a[t].leaf())return -1;
int mid=a[t].mid();
double ans=-1;
if(x1<=mid)
ans=max(ans,query(L(t),x1,x2,y1,y2));
if(x2>mid)
ans=max(ans,query(R(t),x1,x2,y1,y2));
return ans;
}
int main()
{
int n;
double x1,x2,y1,y2;
char s[2];
int eps=1e-6;
while(scanf("%d",&n))
{
if(n==0)break;
build(1,100,200,0,1000);
while(n--)
{
scanf("%s",s);
if(s[0]=='I')
{
scanf("%lf%lf%lf",&x1,&x2,&y1);
update(1,int(x1),int(x1),int(x2*10),int((x2)*10),y1);
}
else
{
scanf("%lf%lf%lf%lf",&x1,&x2,&y1,&y2);
if(x1>x2)
swap(x1,x2);//不加会错
if(y1>y2)
swap(y1,y2);
double ans=query(1,int(x1),int(x2),int((y1)*10),int((y2)*10));
if(ans==-1)
printf("-1\n");//输出-1,不是-1.0
else
printf("%.1lf\n",ans);
}
}
}
}
hdu1823 二维线段树
最新推荐文章于 2021-11-15 22:13:06 发布