https://nanti.jisuanke.com/t/41384
思路:离散化,线段树,要么自己本身,要么就是区间去掉得下一个;
#include <bits/stdc++.h>
#include <tr1/unordered_map>
#define endl '\n'
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define IT set<node>::iterator
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
typedef long long LL;
typedef long long ll;
const int maxn=3e6+9;
#define INF 0x3f3f3f3f
#define lson rt<<1
#define rson rt<<1|1
struct Q
{
int z,x;
}que[maxn];
int x[maxn*2];
int cnt;
int tree[maxn<<2];
void pushup(int rt)
{
tree[rt]=min(tree[lson],tree[rson]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
tree[rt]=x[l-1];
return ;
}
int mid=(l+r)>>1;
build(l,mid,lson);
build(mid+1,r,rson);
pushup(rt);
}
void update(int pos,int l,int r,int rt)
{
if(l==r)
{
tree[rt]=INF;
return ;
}
int mid=(l+r)>>1;
if(pos<=mid)update(pos,l,mid,lson);
else update(pos,mid+1,r,rson);
pushup(rt);
}
int query(int ql,int qr,int l,int r,int rt)
{
if(ql<=l&&qr>=r)
{
return tree[rt];
}
int mid=(l+r)>>1;
int tmp=INF;
if(mid>=ql) tmp=min(tmp,query(ql,qr,l,mid,lson));
if(mid<qr) tmp=min(tmp,query(ql,qr,mid+1,r,rson));
return tmp;
}
int main()
{
int n,q;
scanf("%d %d",&n,&q);
for(int i=0;i<q;i++)
{
int op;
scanf("%d",&op);
int xx;
scanf("%d",&xx);
que[i]={op,xx};
x[cnt++]=xx;
x[cnt++]=xx+1;
}
sort(x,x+cnt);
int m=unique(x,x+cnt)-x;
build(1,m,1);
for(int i=0;i<q;i++)
{
int op=que[i].z;
int xx=lower_bound(x,x+m,que[i].x)-x+1;
if(op==1)
{
update(xx,1,m,1);
}
else
{
int ans=query(xx,m,1,m,1);
if(ans==INF)
ans=-1;
else {
if(ans>n) ans=-1;
}
printf("%d\n",ans);
}
}
return 0;
}