30pt求调,已知的问题都考虑到了awa
查看原帖
30pt求调,已知的问题都考虑到了awa
747882
_adil_楼主2024/4/4 09:16
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<math.h>
#include<set>
#include<vector>
#include<map>
#include<utility>
#include<iomanip>
#include<iterator>
#define N 600009
#define INF 0x3f3f3f3f
#define mod 998244353
#define c continue
using namespace std;
typedef long long ll;
typedef long double ldb;
typedef pair<int,int> pii;
int n,m,cnt,lst;
int a[N*6],pr[N*6],nxt[N*6];//pr,nxt[i]和表示上面与i位置上的数相同的最近的位置
map<int,int> mp;
set<int> s[N*2];
struct node{
  int l,r,mx,mn,gcd,pre;
}t[N*6];
inline int g(int u,int v){
  return v?g(v,u%v):u;
}
inline node pushup(node x,node y){
  return {x.l,y.r,max(x.mx,y.mx),min(x.mn,y.mn),g(x.gcd,g(abs(a[y.l]-a[x.r]),y.gcd)),max(x.pre,y.pre)};
}
void build(int p,int l,int r){
  t[p].l=l,t[p].r=r;
  if(l==r){t[p]={l,r,a[l],a[l],0,pr[l]};return;}
  int mid=(l+r)/2;
  build(p*2,l,mid);build(p*2+1,mid+1,r);
  t[p]=pushup(t[p*2],t[p*2+1]);
}
void change(int p,int x,node q){
  if(x<t[p].l||x>t[p].r)return;
  if(t[p].l==t[p].r){t[p]=q;t[p].l=x,t[p].r=x;return;}
  int mid=(t[p].l+t[p].r)/2;
  if(x<=mid)change(p*2,x,q);
  else change(p*2+1,x,q);
  t[p]=pushup(t[p*2],t[p*2+1]);
}
node ask(int p,int l,int r){
  if(l<=t[p].l&&r>=t[p].r)return t[p];
  node tmp1,tmp2;int mid=(t[p].l+t[p].r)/2,flg1=0,flg2=0;
  if(l<=mid){flg1=1,tmp1=ask(p*2,l,r);}
  if(r>mid){flg2=1,tmp2=ask(p*2+1,l,r);}
  if(flg1&&flg2)return pushup(tmp1,tmp2);
  if(flg1)return tmp1;return tmp2;
}
void work(int x){//修改边上的差分
  if(x>1)change(1,x-1,{x-1,x-1,a[x-1],a[x-1],0,pr[x-1]});
  if(x<n)change(1,x+1,{x+1,x+1,a[x+1],a[x+1],0,pr[x+1]});
}
int main(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    cin>>a[i];
      if(mp.find(a[i])==mp.end())mp[a[i]]=++cnt,s[cnt].insert(i);
    else{
      int y=mp[a[i]],z=*--s[y].end();
      pr[i]=z,nxt[z]=i;s[y].insert(i);
    }
  }
  build(1,1,n);
  for(int i=1;i<=m;i++){
    int op,x,y,l,r,k;
    cin>>op;
    if(op==1){
      cin>>x>>y;x^=lst,y^=lst;
      nxt[pr[x]]=nxt[x],pr[nxt[x]]=pr[x];
      int z=a[nxt[x]];
     change(1,nxt[x],{nxt[x],nxt[x],z,z,0,pr[x]});
     work(nxt[x]);
      s[mp[a[x]]].erase(x);
      if(mp.find(y)==mp.end()){
        mp[y]=++cnt;s[cnt].insert(x);
        pr[x]=0,nxt[cnt]=0;
      }else{
        int z=mp[y];
        set<int>::iterator it=s[z].lower_bound(x);
        if(it==s[z].begin()){
          pr[x]=0,nxt[x]=*it,pr[*it]=x;
          change(1,*it,{*it,*it,a[*it],0,x});
          work(*it);
        }else if(it==s[z].end()){
          --it;
          pr[x]=*it,nxt[*it]=x,nxt[x]=0;
        }else{
          set<int>::iterator nit=--it;++it;//nit前驱it后继
          pr[*it]=x,pr[x]=*nit;
          nxt[*nit]=x,nxt[x]=*it;
          change(1,*it,{*it,*it,a[*it],0,x});
          work(*it);
        }
      }
      a[x]=y;
      change(1,x,{x,x,y,y,0,pr[x]});
      work(x);
    }else{
      cin>>l>>r>>k;
      l^=lst,r^=lst,k^=lst;
      node pp=ask(1,l,r);
      if(k==0){if(pp.mx==pp.mn){lst++;cout<<"Yes\n";}else cout<<"No\n";}
      else if((l==r)||((pp.mx-pp.mn==k*(r-l))&&(pp.gcd==k||pp.gcd<=0)&&(k<=0||pp.pre<l))){
        lst++;cout<<"Yes\n";
      }else cout<<"No\n";
    }
  }
  return 0;
}
2024/4/4 09:16
加载中...