Rt,我一发卡常分块在不吸氧的情况下擦着边过了
#include<bits/stdc++.h>
using namespace std;
int T,q,mod,L[1005],R[1005],siz,pos[100005],now,opt,m,bel[100005];
long long a[100005],prod[1005],ans;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&q,&mod);
siz=ceil(sqrt(q));
now=0;
for(int i=1;i<=siz;i++){
L[i]=(i-1)*siz+1;
R[i]=i*siz;
prod[i]=1;
for(int j=L[i];j<=R[i];j++){
a[j]=1;
bel[j]=i;
}
}
for(int i=1;i<=q;i++){
scanf("%d",&opt);
if(opt==1){
scanf("%d",pos+i);
a[++now]=pos[i];
prod[bel[now]]=(prod[bel[now]]*pos[i])%mod;
pos[i]=now;
}
else{
scanf("%d",pos+i);
a[pos[pos[i]]]=1;
prod[bel[pos[pos[i]]]]=1;
for(int j=L[bel[pos[pos[i]]]];j<=R[bel[pos[pos[i]]]];j++)
prod[bel[pos[pos[i]]]]=(prod[bel[pos[pos[i]]]]*a[j])%mod;
}
ans=1;
for(int i=1;i<=bel[now];i++) ans=(ans*prod[i])%mod;
printf("%d\n",ans);
}
}
}
或者说在标签里加上分块