线段树裸题
难度在于认识到这个没法线性做
#include<cstdio> using namespace std; int n,mod,tr[400005]; void insert(int t,int l,int r,int x,int y){ if (l==r){ tr[t]=y; return; } int mid=(l+r)>>1; if (x<=mid) insert(t<<1,l,mid,x,y); else insert(t<<1|1,mid+1,r,x,y); tr[t]=1ll*tr[t<<1]*tr[t<<1|1]%mod; } void build(int t,int l,int r){ tr[t]=1; if (l==r) return; int mid=(l+r)>>1; build(t<<1,l,mid); build(t<<1|1,mid+1,r); } int main(){ int T; scanf("%d",&T); while (T--){ scanf("%d%d",&n,&mod); build(1,1,n); for (int i=1; i<=n; i++){ int cas; scanf("%d",&cas); if (cas==1){ int x; scanf("%d",&x); insert(1,1,n,i,x); } else{ int x; scanf("%d",&x); insert(1,1,n,x,1); } printf("%d ",tr[1]); } } return 0; }