#include<cstdio>
#define maxn 100010
int t;
int Q,M;
int m[maxn];
int operation[maxn];
int tr[maxn<<2];
void PushUp(int rt){
tr[rt]=(tr[rt<<1]*tr[rt<<1|1])%M;
}
void Build(int l,int r,int rt){
tr[rt]=1;
if(l==r){
tr[rt]=m[l];
return;
}
int mid=(l+r)>>1;
Build(l,mid,rt<<1);
Build(mid+1,r,rt<<1|1);
PushUp(rt);
}
void Update(int Pos,int l,int r,int rt,int C){
if(l==r){
tr[rt]=C;
return;
}
int mid=(l+r)>>1;
if(Pos<=mid)Update(Pos,l,mid,rt<<1,C);
else Update(Pos,mid+1,r,rt<<1|1,C);
PushUp(rt);
}
int main(){
scanf("%d",&t);
for(int NUM=0;NUM<t;NUM++){
scanf("%d%d",&Q,&M);
for(int i=1;i<=Q;i++)m[i]=1;
Build(1,Q,1);
for(int i=1;i<=Q;i++){
int op;
scanf("%d%d",&op,&m[i]);
if(op==1)
Update(i,1,Q,1,m[i]);
else if(op==2)
Update(m[i],1,Q,1,1);
printf("%d\n",tr[1]);
}
}
}
#include<cstdio>
#define maxn 100010
int t;
int Q,M;
int m[maxn];
int operation[maxn];
int tr[maxn<<2];
void PushUp(int rt){
tr[rt]=(tr[rt<<1]*tr[rt<<1|1])%M;
}
void Build(int l,int r,int rt){
tr[rt]=1;
if(l==r){
tr[rt]=m[l];
return;
}
int mid=(l+r)>>1;
Build(l,mid,rt<<1);
Build(mid+1,r,rt<<1|1);
PushUp(rt);
}
void Update(int Pos,int l,int r,int rt){
if(l==r){
tr[rt]=1;
return;
}
int mid=(l+r)>>1;
if(Pos<=mid)Update(Pos,l,mid,rt<<1);
else Update(Pos,mid+1,r,rt<<1|1);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R)return tr[rt];
int mid=(l+r)>>1;
int ANS=1;
if(L<=mid)ANS=(ANS*Query(L,R,l,mid,rt<<1))%M;
if(mid<R)ANS=(ANS*Query(L,R,mid+1,r,rt<<1|1))%M;
return ANS;
}
int main(){
scanf("%d",&t);
for(int NUM=0;NUM<t;NUM++){
scanf("%d%d",&Q,&M);
for(int i=1;i<=Q;i++){
int op;
operation[i]=0;
scanf("%d%d",&op,&m[i]);
if(op==2){
operation[i]=m[i];
m[i]=1;
}
}
Build(1,Q,1);
for(int i=1;i<=Q;i++){
for(;!operation[i]&&i<=Q;i++)printf("%d\n",Query(1,i,1,Q,1));
Update(operation[i],1,Q,1);
printf("%d\n",Query(1,i,1,Q,1));
}
}
}
本人已试过将
int改成long long,
但还是全WA QAQ