Jennie
显然可以模拟,但是谁会喜欢写高精和逆元呢?
需要撤销乘法操作,该怎么做呢
如果说一个个乘法结合起来的话,那么撤销就是把一个数变成1
那么就是一个线段树的问题了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int tree[400005];
int t;
int q,mod;
int f,x;
void pushup(int r){
tree[r]=tree[r<<1]*tree[r<<1|1]%mod;
}
void chan(int ro,int l,int r,int L,int R,int key){
if(L<=l&&r<=R){
tree[ro]=key%mod;
return ;
}
int mid=(l+r)>>1;
if(L<=mid) chan(ro<<1,l,mid,L,R,key);
if(R>mid) chan(ro<<1|1,mid+1,r,L,R,key);
pushup(ro);
}
signed main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&q,&mod);
for(int i=1;i<=q;++i){
chan(1,1,q,i,i,1);
}
for(int i=1;i<=q;++i){
scanf("%d%d",&f,&x);
if(f==1){
chan(1,1,q,i,i,x);
cout<<tree[1]<<endl;
}else{
chan(1,1,q,x,x,1);
cout<<tree[1]<<endl;
}
}
}
return 0;
}