求调
查看原帖
求调
1109707
godmoo楼主2024/5/30 14:05
#include<bits/stdc++.h>
#define pb push_back
#define is insert
#define INF INT_MAX
#define Mod(a,m) (((a)%(m)+(m))%(m))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=1e5+5;
const int SQ=405;
int n,q,a[N],lzy[SQ],gcd[SQ],xo[N];
int len,num,st[SQ],ed[SQ],blk[N];
char op[10];
set<pii> s[N];
void pushup(int u){
	gcd[u]=0;
	for(int i=st[u];i<=ed[u];i++) gcd[u]=__gcd(gcd[u],a[i]);
}
void init(){
	len=sqrt(n);
	num=n/len+(n%len!=0);
	for(int i=1;i<=num;i++){
		st[i]=(i-1)*len+1;
		ed[i]=i*len;
		for(int j=st[i];j<=ed[i];j++) blk[j]=i;
	}
	for(int i=1;i<=num;i++){
		for(int j=st[i];j<=ed[i];j++){
			xo[j]=xo[j-1]^a[j];
			s[i].is({xo[j],j});
			gcd[i]=__gcd(gcd[i],a[j]);
		}
	}
}
void modify(int pos,int x){
	int tmp=a[pos]^x;
	a[pos]=x;
	for(int i=pos;i<=ed[blk[pos]];i++){
		s[blk[i]].erase({xo[i],i});
		s[blk[i]].is({xo[i]^=tmp,i});
	}
	pushup(blk[pos]);
	for(int i=blk[pos]+1;i<=num;i++) lzy[i]^=x;
}
int query(ll x){
//	cout<<x<<endl; 	
//	cout<<num<<endl;
	int tmp=0;
	for(int i=1,lst;i<=num;i++){
		lst=tmp,tmp=__gcd(tmp,gcd[i]);
//		cout<<"new block"<<i<<" "<<lst<<" "<<tmp<<endl;
		if(lst!=tmp){ //最多 log(a)次 
			int cur=lst;
			for(int j=st[i];j<=ed[i];j++){
				cur=__gcd(cur,a[j]);
//				cout<<j<<" "<<cur<<" "<<1ll*cur*(xo[j]^lzy[i])<<endl;
//                int debug=0;
//                for(int k=1;k<=j;k++) debug^=a[k];
//                cout<<debug<<" "<<(xo[j]^lzy[i])<<endl;
				if(1ll*cur*(xo[j]^lzy[i])==x) return j;
			}
		}
		else{
			if(x%tmp) continue;
			auto it=s[i].lower_bound({(x/tmp)^lzy[i],0});
//			cout<<(*it).first<<" "<<(*it).second<<endl;
			if(it==s[i].end()||1ll*(it->first^lzy[i])*tmp!=x) continue;
			return it->second;
		}
	}
	return -1;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	init();
	scanf("%d",&q);
	for(int i=1,pos;i<=q;i++){
		ll x;
		scanf("%s",op);
		if(op[0]=='M') scanf("%d%lld",&pos,&x),pos++,modify(pos,x);
		if(op[0]=='Q'){
			 scanf("%lld",&x);
			 int ans=query(x);
			 if(ans==-1) printf("no\n");
			 else printf("%d\n",ans-1);
		}
 //       for(int i=1;i<=num;i++) cout<<lzy[i]<<" ";
//        puts(" ");
	}
	return 0;
}

2024/5/30 14:05
加载中...