入栈为1,出栈为-1,区间更新即可
然后维护最大值, 从右到左找第一个等于1的位置。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
int a[N<<2]={0},lazy[N<<2]={0},vis[N];
void up(int rt)
{
a[rt]=max(a[rt<<1],a[rt<<1|1]);
}
void down(int rt)
{
if(lazy[rt])
{
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
a[rt<<1]+=lazy[rt];
a[rt<<1|1]+=lazy[rt];
lazy[rt]=0;
}
}
void update(int L,int R,int x,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
a[rt]+=x;
lazy[rt]+=x;
return;
}
down(rt);
int mid=(l+r)>>1;
if(L<=mid) update(L,R,x,ls);
if(mid<R) update(L,R,x,rs);
up(rt);
}
int query(int l,int r,int rt)
{
if(l==r&&a[rt]==1)return l;
else if(l==r) return 0;
int mid=(l+r)>>1;
down(rt);
if(a[rt]<=0) return 0;
int f=query(rs);
if(f) return f;
return query(ls);
}
int main()
{
int m,p,cmd,x;;
scanf("%d",&m);
vis[0]=-1;
for(int i=0;i<m;i++)
{
scanf("%d%d",&p,&cmd);
if(cmd)
{
scanf("%d",&x);
vis[p]=x;
update(1,p,1,1,m,1);
}
else update(1,p,-1,1,m,1);
printf("%d\n",vis[query(1,m,1)]);
}
}