/*
以时间为区间建立线段树,我们结构体内维护的是区间内数的乘积
对于某次操作,如果是乘某个数,那么我们就将那个点改成这个数,如果是除某个数,那么我们就找到
那个位置将它变成1
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int w[N];
int q,mod;
struct Node
{
int l,r;
LL v;
}tr[N * 4];
void pushup(int u)
{
tr[u].v = tr[u << 1].v * tr[u << 1 | 1].v % mod;
}
void build(int u,int l,int r)
{
if(l == r)tr[u] = {r,r,1};//叶节点初始要乘的数均为1
else
{
tr[u] = {l,r};
int mid = l + r >> 1;
build(u << 1, l, mid),build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
void modify(int u,int x,int v)
{
if(tr[u].l == x && tr[u].r == x)tr[u].v = v;
else
{
int mid = tr[u].l + tr[u].r >> 1;
if(x <= mid)modify(u << 1,x,v);
else modify(u << 1 | 1,x,v);
pushup(u);
}
}
LL query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r)return tr[u].v;
else
{
int mid = tr[u].l + tr[u].r >> 1;
LL sum = 1;
if(l <= mid)sum = query(u << 1,l,r);
if(r > mid)sum *= query(u << 1 | 1,l,r) % mod;
return sum;
}
}
int main()
{
int t;cin >> t;
while(t --)
{
scanf("%d%d",&q,&mod);
build(1,1,q);
for(int i = 1; i <= q; i ++)
{
int op,m;scanf("%d%d",&op,&m);
if(op == 1)
{
modify(1,i,m);
printf("%d\n",query(1,1,i) % mod);
}
else
{
modify(1,m,1);//除相当于将那个位置的数改成1,因为我们存的是乘的数是多少
printf("%d\n",query(1,1,i) % mod);
}
}
}
return 0;
}