需要离散化x坐标
具体看代码和注释:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
const int maxn=200010;
struct node
{
int x,y;
int flag;
bool operator<(const node &a)const
{
if(x==a.x)return y<a.y;
return x<a.x;
}
}point[maxn],ans,x[maxn*2];
//把x作为一维坐标,y作为权值,那么久吧二维转化成了一维
struct INtervalTree
{
//线段树维护区间最大y值
int maxv[maxn<<3];
void build(){memset(maxv,-1,sizeof(maxv));}
void pushup(int o)
{
maxv[o]=max(maxv[o<<1],maxv[o<<1|1]);
}
void update(int o,int l,int r,int tmp,int pos,int val)
{
if(l==r)
{
maxv[o]=((tmp==0)?val:-1);
return;
}
int mid=(l+r)>>1;
if(pos<=mid)update(o<<1,l,mid,tmp,pos,val);
else update(o<<1|1,mid+1,r,tmp,pos,val);
pushup(o);
}
void query(int o,int l,int r,int q1,int q2)
{
//如果区间的右端点比查询点的x小或者此区间的最大的y比查询的小则不符合条件
if(x[r].x<=q1||maxv[o]<=q2)return;
if(l==r)
{
ans=x[l];
return;
}
int mid=(l+r)>>1;
query(o<<1,l,mid,q1,q2);
if(ans.x==-1)query(o<<1|1,mid+1,r,q1,q2);
}
}tree;
int main()
{
//freopen("in.txt","r",stdin);
int n,num=0;
char op[10];
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s%d%d",op,&point[i].x,&point[i].y);
if(op[0]!='r')
x[num++]=point[i];
if(op[0]=='a')point[i].flag=0;
else if(op[0]=='r')point[i].flag=1;
else point[i].flag=2;
}
sort(x,x+num);
tree.build();
for(int i=0;i<n;i++)
{
int pos=lower_bound(x,x+num,point[i])-x;
if(point[i].flag<2)
tree.update(1,0,num-1,point[i].flag,pos,point[i].y);
else
{
ans.x=ans.y=-1;
tree.query(1,0,num-1,point[i].x,point[i].y);
if(ans.x==-1&&ans.y==-1)printf("-1\n");
else printf("%d %d\n",ans.x,ans.y);
}
}
return 0;
}