求助,szm可以给你投币
查看原帖
求助,szm可以给你投币
489327
小熙熙楼主2024/10/7 10:44
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#define ll long long
#define bug cout<<"bug"<<"\n"
#define mk make_pair
#define fi first
#define se second
#define pii pair<ll,ll>
#define fo(i,a,b) for(ll i=a;i<=b;i++)
#define rfo(i,a,b) for(ll i=a;i>=b;i--)
using namespace std;
const ll maxn=4e5+100;
const ll inf=0x3f3f3f3f;
const double eps=1e-9;
const ll mod=1e9+7;
inline ll rd(){ll x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int n,q;
struct node{
	int l,r;
	int mi;
}t[maxn<<2];
int  ls[maxn],rs[maxn],bit[maxn];
void pushup(int p){t[p].mi=min(t[p<<1].mi,t[p<<1|1].mi);}
void build(int p,int l,int r){
	t[p].l=l;t[p].r=r;
	if(l==r){t[p].mi=inf;return;}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);build(p<<1|1,mid+1,r);
	pushup(p);
}
void update(int p,int pos,int x){
	if(t[p].l==t[p].r){t[p].mi=min(t[p].mi,x);return ;}
	int mid=(t[p].l+t[p].r)>>1;
	if(pos<=mid) update(p<<1,pos,x);
	else update(p<<1|1,pos,x);
	pushup(p);
}
int query(int p,int l,int r){
	if(l<=t[p].l&&t[p].r<=r) return t[p].mi;
	int mid=(t[p].l+t[p].r)>>1,res=inf;
	if(l<=mid) res=min(res,query(p<<1,l,r));
	if(r>mid) res=min(res,query(p<<1|1,l,r));
	return res;
}
int lowbit(int x){return x&(-x);}
void add(int pos,int x){while(pos<=n){bit[pos]+=x;pos+=lowbit(pos);}}
int ask(int x){int sum=0;while(x){sum+=bit[x];x-=lowbit(x);}return sum;}
int fire(int x){if(rs[x]==x+1||rs[x]==n+1) return rs[x];return rs[x]=fire(rs[x]-1);}
int file(int x){if(ls[x]==x-1||ls[x]==0) return ls[x];return ls[x]=file(ls[x]+1);}
int main(){
	freopen("machine.in","r",stdin);
	freopen("machine.out","w",stdout);
	n=rd(),q=rd();
	build(1,1,n+2);
	for(int i=1;i<=n;i++){rs[i]=i+1;ls[i]=i-1;}
	rs[0]=1,ls[n+1]=n;
	while(q--){
		int op=rd();
		if(op==1){
			int pos=rd();
			if(ask(pos)) cout<<"0"<<"\n";
			else{
				int l=file(pos);
				int r=fire(pos);
				l++;
		//		cout<<l<<"  "<<r<<"\n";
				int det=query(1,l,pos);
				if(det<=r-1) cout<<"1"<<"\n";
				else cout<<"?"<<"\n";
			}
		}
		else{
			int l=rd(),r=rd(),x=rd();
			if(x==1) update(1,l,r);
			else{
				add(l,1);add(r+1,-1);
				int t=l-1;
				while(rs[t]<=r){
					int tt=t;
					t=fire(t);
					rs[tt]=rs[r];
				}
				t=r+1;
				while(ls[t]>=l){
					int tt=t;
					t=file(t);
					ls[tt]=ls[l];
				}
			}
		}
	}
	return 0;
}
2024/10/7 10:44
加载中...