MLE ON #1,5,9,悬一关
查看原帖
MLE ON #1,5,9,悬一关
733650
我梦见一片焦土楼主2024/2/25 00:31
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
const int INF=0x3f3f3f3f;
int n,m,la,a[N],pr[N],af[N],cnt;
map<int,int>mp;
set<int>s[N];
int gcd(int a, int b){ 
	return (b==0)?a:gcd(b,a%b);
}
struct node{
	int l,r,g,maxn,minn,pn,an,pm;
	node operator +(const node &a){
		node c;
		c.l=l;
		c.r=a.r;
		c.pm=max(pm,a.pm);
		c.g=gcd(gcd(g,a.g),abs(a.pn-an));
		c.maxn=max(maxn,a.maxn);
		c.minn=min(minn,a.minn);
		c.an=a.an;
		c.pn=pn;
		return c;
	}
}tree[N<<2];
int re(){
	int sum=0,fh=1;
	char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()){
		fh-=(ch=='-')<<1;
	}
	for (;ch>='0'&&ch<='9';ch=getchar()){
		sum=sum*10+(ch^48);
	}
	return sum*fh;
}
void build(int p, int l, int r){
	tree[p].l=l;
	tree[p].r=r;
	if(l==r){
		tree[p].g=0;
		tree[p].maxn=tree[p].minn=tree[p].pn=tree[p].an=a[l];
		tree[p].pm=pr[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	tree[p]=tree[p<<1]+tree[p<<1|1];
}
void change(int p,int x,node v){
	if(x==0){
		return;
	}
	if(tree[p].l==tree[p].r){
		tree[p]=v;
		return;
	}
	int mid=(tree[p].l+tree[p].r)>>1;
	if(x<=mid){
		change(p<<1,x,v);
	}else{
		change(p<<1|1,x,v);
	}
	tree[p]=tree[p<<1]+tree[p<<1|1];
}
node ask(int p,int l,int r){
	if(tree[p].l>=l&&tree[p].r<=r){
		return tree[p];
	}
	int mid=(tree[p].l+tree[p].r)>>1;
	if(l<=mid&&r>mid){
		return ask(p<<1,l,r)+ask(p<<1|1,l,r);
	}else if(l<=mid){
		return ask(p<<1,l,r);
	}else{
		return ask(p<<1|1,l,r);
	}
}
void w1(int la){
	int x=re()^la,y=re()^la;
	af[pr[x]]=af[x];
	pr[af[x]]=pr[x];
	change(1,af[x],(node){af[x],af[x],0,a[af[x]],a[af[x]],a[af[x]],a[af[x]],pr[af[x]]});
	s[mp[a[x]]].erase(x);
	a[x]=y;
	pr[x]=af[x]=0;
	if(mp.find(y)==mp.end()){
		mp[y]=++cnt;
		s[cnt].insert(x);
		change(1,x,(node){x,x,0,y,y,y,y,0});
		return ;
	}
	y=mp[y];
	auto it=s[y].lower_bound(x);
	if(it==s[y].begin()){
		af[x]=*s[y].begin();
		pr[*s[y].begin()]=x;
		change(1,x,(node){x,x,0,a[x],a[x],a[x],a[x],0});
		int tmp=*s[y].begin();
		change(1,tmp,(node){tmp,tmp,0,a[tmp],a[tmp],a[tmp],a[tmp],pr[tmp]});
		s[y].insert(x);
	}else if(it==s[y].end()){
		it--;
		pr[x]=*it;
		af[*it]=x;
		change(1,x,(node){x,x,0,a[x],a[x],a[x],a[x],pr[x]});
		s[y].insert(x);
	}else{
		auto it2=it;
		it--;
		pr[x]=*it;
		af[x]=*it2;
		af[*it]=x;
		pr[*it2]=x;
		change(1,x,(node){x,x,0,a[x],a[x],a[x],a[x],pr[x]});
		int tmp=*it2;
		change(1,tmp,(node){tmp,tmp,0,a[tmp],a[tmp],a[tmp],a[tmp],pr[tmp]});
		s[y].insert(x);
	}
}
void w2(int &la){
	int l=re()^la,r=re()^la,k=re()^la;
	if(l>r){
		swap(l,r);
	}
	node tmp=ask(1,l,r);
	if(((tmp.maxn-tmp.minn)==1ll*(r-l)*k)&&(tmp.g==k||!tmp.g)&&(tmp.pm<l||k==0)){
		cout<<"Yes"<<endl;
		la++;
	}else{
		cout<<"No"<<endl;
	}
}
signed main(){
	n=re(),m=re();
	for(int i=1;i<=n;i++){
		a[i]=re();
		if(mp.find(a[i])==mp.end()){
			mp[a[i]]=++cnt;
			s[mp[a[i]]].insert(i);
		}else{
			pr[i]=*--s[mp[a[i]]].end();
			af[*--s[mp[a[i]]].end()]=i;
			s[mp[a[i]]].insert(i);
		}
	}
	build(1,1,n);
	for(int i=1,x;i<=m;i++){
		x=re();
		if(x==1){
			w1(la);
		}else{
			w2(la);
		}
	}
	return 0;
}
2024/2/25 00:31
加载中...