#include<bits/stdc++.h>
#define int long long
using namespace std;
int p,q,M;
struct tree{
int val,tag;
}tree[400005];
int a[100005];
inline int ls(int p){
return p<<1;
}
inline int rs(int p){
return p<<1|1;
}
inline void pushup(int p){
tree[p].val=tree[ls(p)].val*tree[rs(p)].val%M;
}
inline void build(int l,int r,int p){
if(l==r){
tree[p].val=1;
return;
}
int mid=l+r>>1;
build(l,mid,ls(p));
build(mid+1,r,rs(p));
pushup(p);
}
inline void update(int l,int r,int ql,int qr,int p,int k){
if(l>qr||r<ql){
return;
}
if(qr>=r&&ql<=l){
tree[p].val=k;
return;
}
int mid=l+r>>1;
update(l,mid,ql,qr,ls(p),k);
update(mid+1,r,ql,qr,rs(p),k);
pushup(p);
}
inline int query(int l,int r,int ql,int qr,int p){
if(l>qr||r<ql)return 1;
if(l==r)return tree[p].val;
int mid=l+r>>1;
return query(l,mid,ql,qr,ls(p))*query(mid+1,r,ql,qr,rs(p))%M;
}
signed main(){
int t;
cin>>t;
while(t--){
cin>>q>>M;
p=0;
int N=q;
build(1,q,1);
while(N--){
int op,m;
cin>>op>>m;
p++;
// if(p==5||p==6){
// cout<<query(1,q,4,4,1)<<"|||\n";
// }
// cout<<m<<" "<<p<<"|QAWDS\n";
if(op==1){
update(1,q,p,p,1,m);
}
else{
// if(p==6){
//// cout<<query(1,q,4,4,1)<<"|||";
// }
update(1,q,m,m,1,1);
}
cout<<query(1,q,1,p,1)<<endl;
}
}
return 0;
}