题目链接:点击打开链接
线段树维护y值大于val的最小x值
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <iostream> #include <map> #include <set> #include <math.h> using namespace std; #define inf 1000000010 #define ll int #define N 200005 #define L(x) (x<<1) #define R(x) (x<<1|1) inline ll Mid(ll a,ll b){return (a+b)>>1;} ll n; struct node{ ll x,y; node(ll a=0,ll b=0):x(a),y(b){} bool operator<(const node &a) const{ if(a.x==x) return a.y>y; return a.x>x; } ll op; }in[N]; set<node>myset; set<node>::iterator p; struct Edge{ int l, r, id; int maxx, lval; set<ll>st; }tree[N<<4]; set<ll>::iterator pp; set<ll>lisan; void build(int l,int r,int id){ tree[id].l =l ,tree[id].r =r; tree[id].maxx = tree[id].lval = -1; tree[id].st.clear(); tree[id].st.insert(-1); if(l==r)return ; int mid = Mid(l,r); build(l,mid,L(id)); build(mid+1,r,R(id)); } void updata(ll pos, ll id, ll val, ll o){ // o = 1表示插入 if(tree[id].l== tree[id].r) { if(o==1){ tree[id].st.insert(val); tree[id].lval = tree[id].maxx = max(tree[id].maxx,val); return ; } else tree[id].st.erase(val); pp = tree[id].st.end(); pp--; tree[id].lval = tree[id].maxx = *pp; return; } ll mid = Mid(tree[id].l,tree[id].r); if(mid<pos)updata(pos,R(id),val,o); else updata(pos, L(id),val,o); tree[id].lval = tree[L(id)].lval; tree[id].maxx = max(tree[L(id)].maxx, tree[R(id)].maxx); } ll query(ll l, ll r, ll id, ll val){ if(l <=tree[id].l && tree[id].r<=r) { if(tree[id].maxx <= val)return -1; if(tree[id].lval >val)return tree[id].l; } ll mid = Mid(tree[id].l,tree[id].r); if(mid<l)return query(l,r,R(id),val); else if(r<=mid)return query(l,r,L(id),val); ll ans = query(l,mid,L(id),val); if(ans!=-1)return ans; return query(mid+1,r,R(id),val); } ll pos[N<<1]; map<ll,ll>mp; int main(){ ll x,y; while(~scanf("%d",&n)) { myset.clear(); mp.clear(); lisan.clear(); for(ll i = 0; i < n; i++) { char s[10];scanf("%s",s); scanf("%d %d",&in[i].x,&in[i].y); lisan.insert(in[i].x); if(s[0]=='a')in[i].op = 1; else if(s[0]=='r')in[i].op=2; else in[i].op = 3; } ll siz = 1; for(pp=lisan.begin(); pp!=lisan.end(); pp++) { pos[siz] = *pp; mp.insert(pair<ll,ll>(*pp,siz)); siz++; } for(ll i = 0; i < n; i++)in[i].x = mp.find(in[i].x)->second; build(1,siz,1); for(ll i = 0; i < n; i++){ x = in[i].x, y = in[i].y; if(in[i].op == 1){ myset.insert(node(pos[x],y)); updata(in[i].x,1,in[i].y,1); } else if(in[i].op == 2){ myset.erase(node(pos[x],y)); updata(in[i].x,1,in[i].y,0); } else { ll he = query(in[i].x+1,siz,1,in[i].y); if(he==-1){puts("-1");continue;} printf("%d %d ",pos[he],myset.lower_bound(node(pos[he],in[i].y+1))->y); } } } return 0; }