大致题意:
给出n个询问,每次询问有三种:
1、往平面上加一个点
2、删除平面上的一个点
3、给出一个点p,查询平面上某点q,使得q.x>p.x且q.y>p.y,输出x轴坐标最小的q,若有多个,输出y最小的
点的坐标较大,需要先离散点坐标,线段树维护x坐标对应的最大的y坐标,
查询用线段树定位x坐标,用set数组查询y坐标即可,因为总共只会用2e5个点,不会超内存
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 #include<set> 7 #include<map> 8 #include<stack> 9 #include<time.h> 10 #include<cstdlib> 11 #include<cmath> 12 #include<list> 13 using namespace std; 14 #define MAXN 200100 15 #define eps 1e-7 16 #define For(i,a,b) for(int i=a;i<=b;i++) 17 #define Fore(i,a,b) for(int i=a;i>=b;i--) 18 #define lson l,mid,rt<<1 19 #define rson mid+1,r,rt<<1|1 20 #define mkp make_pair 21 #define pb push_back 22 #define cr clear() 23 #define sz size() 24 #define met(a,b) memset(a,b,sizeof(a)) 25 #define iossy ios::sync_with_stdio(false) 26 #define fre freopen 27 #define pi acos(-1.0) 28 #define inf 1e9+9 29 #define Vector Point 30 const int Mod=1e9+7; 31 typedef unsigned long long ull; 32 typedef long long ll; 33 struct Point { 34 int x,y; 35 int mk,id; 36 bool operator < (const Point &a)const{ 37 if(x==a.x) return y<a.y; 38 return x<a.x; 39 } 40 bool operator == (const Point &a)const{ 41 return x==a.x && y==a.y; 42 } 43 void read(int idd,int mkk) { 44 scanf("%d%d",&x,&y); 45 id=idd;mk=mkk; 46 } 47 }; 48 bool cmp(Point a,Point b){ 49 return a.id<b.id; 50 } 51 Point ad[MAXN]; 52 int add[MAXN]; 53 int t[MAXN<<2]; 54 set<int>mp[MAXN]; 55 set<int>::iterator it; 56 void up(int rt){ 57 t[rt]=max(t[rt<<1],t[rt<<1|1]); 58 } 59 void Change(int x,int l,int r,int rt){ 60 if(l==r && r==x){ 61 if(mp[x].size()==0){ 62 t[rt]=0; 63 return ; 64 } 65 t[rt]=(*mp[x].rbegin()); 66 return ; 67 } 68 int mid=l+r>>1; 69 if(x<=mid) Change(x,lson); 70 else Change(x,rson); 71 up(rt); 72 } 73 int Query(int x,int xx,int l,int r,int rt){ 74 int mid=l+r>>1; 75 if(l>=xx) { 76 if(t[rt]>x){ 77 if(l==r) return l; 78 else { 79 if(t[rt<<1]>x) return Query(x,xx,lson); 80 else if(t[rt<<1|1]>x) return Query(x,xx,rson); 81 } 82 }else return inf; 83 84 }else{ 85 int res=inf; 86 if(xx<=mid) res=Query(x,xx,lson); 87 if(res!=inf) return res; 88 return Query(x,xx,rson); 89 } 90 } 91 int n,cnt; 92 char s[20]; 93 void solve(){ 94 scanf("%d",&n); 95 cnt=0; 96 For(i,1,n){ 97 scanf("%s",s); 98 if(s[0]=='a') ad[i].read(i,1); 99 else if(s[0]=='r') ad[i].read(i,2); 100 else ad[i].read(i,3); 101 add[i]=ad[i].x; 102 } 103 cnt=n; 104 sort(add+1,add+n+1); 105 cnt=unique(add+1,add+1+cnt)-(add+1); 106 For(i,1,n){ 107 int idx=upper_bound(add+1,add+1+cnt,ad[i].x)-(add+1); 108 if(ad[i].mk==1) { 109 mp[idx].insert(ad[i].y); 110 Change(idx,1,cnt,1); 111 } 112 else if(ad[i].mk==2) { 113 mp[idx].erase(ad[i].y); 114 Change(idx,1,cnt,1); 115 } 116 else { 117 int ans=Query(ad[i].y,idx+1,1,cnt,1); 118 if(ans==inf) {puts("-1");continue;} 119 it=mp[ans].upper_bound(ad[i].y); 120 if(it==mp[ans].end()) {puts("-1");continue;} 121 printf("%d %d\n",add[ans],(*it)); 122 } 123 } 124 } 125 int main(){ 126 // fre("in.txt","r",stdin); 127 int t=0; 128 solve(); 129 return 0; 130 }