题意
给你一个2维坐标系,之后给你n(2e5)次操作,有加点操作,删点操作,和查询操作,加和删就是在二维坐标系里加一个点和删一个点,其中查询点是给你一个(x,y)让你找到一个(x1,y1),(x1>x,y1>y)如果有找到最小的x1,如果x1相同找到最小的y1。
思路
首先n有2e5,我们首先离线我们的所有操作,去重后建一棵长度为n的线段树,我们把他是第几大当作他的区间数,之后我们的线段树维护的是排序离散后第i大的最大的y,那么对于一个加操作或者删操作,我们可以放进set里就好了,加我们就把数放到set里,如果删除点我们就erase他就好了。之后在查询(x,y)的时候,我们先看他是第几大的(设为L),那么我们在线段树中查询区间(L+1,n)看他维护的节点的最大值和我们的y比较,如果满足维护的节点大于我们的y坐标就证明我们找到了这样一个x坐标,之后我们在set[x]里二分找就好了。总结一下就是:我们离散过后按照大小顺序建一棵(1,n)的线段树,他们的节点维护的就是,以x为坐标的最大的y,之后对于一个查询(x,y)我们先看他是第几大(设为L),之后在线段树中查找(L+1,n),看他所维护的最大值Y是否满足我们查询的y,之后二分找就行了
#include <bits/stdc++.h>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn = 2e5+10;
char ch[maxn][20];
int x[maxn],l[maxn],r[maxn];
int seg[maxn<<2