萌新刚学OI,线段树0pts求条
查看原帖
萌新刚学OI,线段树0pts求条
889917
limingyuan333楼主2024/8/28 18:34
#include<bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1
using namespace std;
int T;
int n,m;
int op;
const int N=2e5+10;
struct node{
	int minn;
}tree[N<<2]; 
void push_up(int p){
	tree[p].minn=min(tree[ls].minn,tree[rs].minn);
}
void merge(int k,int p,int l,int r,int x,int y){
	if(x>r||y<l)
		return ;
	if(x<=l&&y>=r){
		tree[p].minn+=(r-l+1);
        return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid){
		merge(k,ls,l,mid,x,y);
	}
	if(mid+1<=y){
		merge(k,rs,mid+1,r,x,y);
	}
    push_up(p);
}
void merge2(int k,int p,int l,int r,int x){
	if(l==r){
		tree[p].minn+=k;
        return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid){
		merge2(k,ls,l,mid,x);
	}
	if(mid+1<=x){
		merge2(k,rs,mid+1,r,x);
	}
    push_up(p);
}
signed main(){
	cin>>T;
	while(T--){
		cin>>n>>m;
		bool flag=0;
		int last=0;
		for(int i=1;i<=m;i++){
			int x;
			cin>>op>>x;
			if(op==1&&(!flag)){
				merge2(1,1,1,n,x);
			}
			else if(flag!=1&&op==2){
				if(x+1<=n)
					merge(1,1,1,n,x+1,n);
				if(x-1>=1)
					merge(1,1,1,n,1,x-1);
			}
			if(tree[1].minn&&!flag){
				last=i;flag=1;
			}
		}
		if(flag)	cout<<last<<'\n';
		else
			cout<<-1<<'\n';
		for(int i=1;i<=n;i++){
			tree[i].minn=tree[i*2].minn=tree[i*3].minn=tree[i*4].minn=0;
		}
	}
	return 0;
}
2024/8/28 18:34
加载中...