rt
我太废物了,所以不会,呜呜呜
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{
int l,r;
int num;
int lazy;
}tree[2000010];
int a[2000010];
int n,m;
void build(int l,int r,int k)
{
tree[k].l=l,tree[k].r=r;
if(l==r)
{
tree[k].num=0;
return;
}
int mid=(l+r)>>1;
build(mid+1,r,k*2+1);
build(l,mid,k*2);
tree[k].num=tree[k*2].num+tree[k*2+1].num;
}
void pushdown(int k)
{
if(!tree[k].lazy)
return;
tree[k*2].num+=tree[k].lazy*(tree[k*2].r-tree[k*2].l+1);
tree[k*2+1].num+=tree[k].lazy*(tree[k*2+1].r-tree[k*2+1].l+1);
tree[k*2].lazy+=tree[k].lazy;
tree[k*2+1].lazy+=tree[k].lazy;
tree[k].lazy=0;
}
void update(int l,int r,int k,int p)
{
if(tree[k].l>=l&&tree[k].r<=r)
{
tree[k].num+=p*(tree[k].r-tree[k].l+1);
tree[k].lazy+=p;
return;
}
pushdown(k);
int mid=(tree[k].l+tree[k].r)>>1;
if(mid>=l)
{
update(l,r,k*2,p);
}
if(mid<r)
{
update(l,r,k*2+1,p);
}
tree[k].num=tree[k*2].num+tree[k*2+1].num;
}
int query(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r)
return min(tree[k].num,1ll);
pushdown(k);
int sum=0,mid=(tree[k].l+tree[k].r)>>1;
if(mid>=l)
{
sum+=query(k*2,l,r);
}
if(mid<r)
{
sum+=query(k*2+1,l,r);
}
return sum;
}
void solve()
{
memset(tree,0,sizeof(tree));
int flag=1e9+10;
cin>>n>>m;
build(1,n,1);
for(int i=1;i<=m;i++)
{
int op;
cin>>op;
if(op==1)
{
int x;
cin>>x;
update(x,x,1,1);
}
else
{
int x;
cin>>x;
update(1,n,1,1);
update(x,x,1,-1);
}
if(query(1,1,n))
{
flag=min(flag,i);
}
}
if(flag==1e9+10)
cout<<-1<<endl;
else
cout<<flag<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
return 0;
}