求卡常
查看原帖
求卡常
658198
gesong楼主2025/1/31 11:48

rt,就 T 了一个点,玄关。

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define lowbit(x) x&-x
using namespace std;
using namespace __gnu_pbds;
const int N=2e5+10;
int n,m;
struct nord{
	tree<int,null_type,less_equal<int>,rb_tree_tag,tree_order_statistics_node_update>t[N];
	inline void add(int i,int x,int op){
		for (;i<=n;i+=lowbit(i)){
			if (op) t[i].insert(x);
			else t[i].erase(t[i].upper_bound(x));
		} 
	}
	inline int get(int i,int l,int r){
		int ans=0;
		for (;i;i-=lowbit(i)){
			if (t[i].empty()) continue;
			ans+=t[i].order_of_key(r+1)-t[i].order_of_key(l);
		}
		return ans;
	}
	inline int get(int l,int r,int l1,int r1){
		return get(r,l1,r1)-get(l-1,l1,r1);
	}
}t[2];
inline int read(){
	char c=getchar();
	int ans=0,f=1;
	while(c<38||c>57) (c==45?f=-1:1),c=getchar();
	while(c>=48&&c<=57) ans=(ans<<1)+(ans<<3)+(c^48),c=getchar();
	return ans*f;
}
#define pii pair<int,int>
pii aa[N];
main(){
	n=read(),m=read();
	int ans=0;
	for (int i=1;i<=m;i++){
		int op=read();
		if (op==1){
			int l=read(),r=read();
			aa[i]={l,r};
			ans+=t[0].get(1,l-1,l,r-1)+t[1].get(r+1,n,l+1,r);
			t[0].add(l,r,1);
			t[1].add(r,l,1);
		}
		else{
			int x=read();
			int l=aa[x].first,r=aa[x].second;
			t[0].add(l,r,0);
			t[1].add(r,l,0);
			ans-=t[0].get(1,l-1,l,r-1)+t[1].get(r+1,n,l+1,r);
		}
		if (ans>0) puts("No");
		else puts("Yes");
	}
	return 0;
}
2025/1/31 11:48
加载中...