题解 [LuoguP4588][TJOI2018] 数学计算
属于是没有区间的线段树了。
以时间为轴建线段树,如果第 i i i 个操作是 1 1 1,把第 i i i 位乘上 m m m;如果是 2 2 2,把第 m m m 位改为 1 1 1。
查询就直接输出根节点。
//P4588
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int t, Q, op; long long M, T[N<<2], m;
void modify(int p, int L, int R, int x, long long v){
if(L == R) T[p] = v ? T[p] * v % M : 1;
else {
int mid = L + R >> 1;
if(x <= mid) modify(p<<1, L, mid, x, v);
else modify(p<<1|1, mid+1, R, x, v);
T[p] = (T[p<<1] * T[p<<1|1]) % M;
}
}
int main(){
scanf("%d", &t);
while(t--){
for(int i = 1; i < N<<2; ++ i) T[i] = 1;
scanf("%d%lld", &Q, &M);
for(int i = 1; i <= Q; ++ i){
scanf("%d%lld", &op, &m);
if(op == 1) modify(1, 1, Q, i, m);
else modify(1, 1, Q, m, 0);
printf("%lld\n", T[1]);
}
}
return 0;
}