萌新刚学线段树求助橙题
查看原帖
萌新刚学线段树求助橙题
276588
lonely_cyx楼主2023/8/22 19:39

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;
}
2023/8/22 19:39
加载中...