线段树乱搞
以修改次数为下标建立线段树, 单点修改
#include <cstdio>
#define k1 k<<1
#define k2 k<<1|1
long long tr[100010*4];
int p,n;
void build(int k,int l,int r){
tr[k]=1;
if(l==r) {
return;
}
int md=(l+r)>>1;
build(k1,l,md),build(k2,md+1,r);
}
void change(int k,int l,int r,int x,int v){
if(x<l||x>r) return;
if(l==r&&l==x){
if(v) tr[k]*=v;
else tr[k]=1;
return;
}
int md=(l+r)>>1;
change(k1,l,md,x,v),change(k2,md+1,r,x,v);
tr[k]=(tr[k1]*tr[k2])%p;
}
int main(){
int i,T,v,op;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&p);
build(1,1,n);
for(i=1;i<=n;i++){
scanf("%d%d",&op,&v);
if(op==1) change(1,1,n,i,v);
else change(1,1,n,v,0);
printf("%lld\n",tr[1]%p);
}
}
}