题意:操作1:x=x*m,输出x%mod。2.x/=map[m]。m即第m次操作,保证该次操作为1操作,并且每个操作最多只会被删一次。q<=1e5。
线段树维护操作信息的乘积,删除把对应位置的权改成1。
标程:
1 #include<bits/stdc++.h> 2 #define mid ((l+r)>>1) 3 using namespace std; 4 typedef long long ll; 5 int read() 6 { 7 int x=0,f=1;char ch=getchar(); 8 while (ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=getchar();} 9 while (ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 10 return x*f; 11 } 12 const int N=1e5+5; 13 int q,mod,op,x; ll sum[N<<2]; 14 void build(int k,int l,int r) 15 { 16 sum[k]=1; 17 if (l==r) return; 18 build(k<<1,l,mid);build(k<<1|1,mid+1,r); 19 } 20 void ins(int k,int l,int r,int x,int y) 21 { 22 if (l==r) {sum[k]=y;return;} 23 if (x<=mid) ins(k<<1,l,mid,x,y); 24 else ins(k<<1|1,mid+1,r,x,y); 25 sum[k]=(ll)sum[k<<1]*sum[k<<1|1]%mod; 26 } 27 int main() 28 { 29 int T=read(); 30 while (T--) 31 { 32 q=read();mod=read(); 33 build(1,1,q); 34 for (int i=1;i<=q;i++) 35 { 36 op=read();x=read(); 37 if (op==1) ins(1,1,q,i,x); 38 else ins(1,1,q,x,1); 39 printf("%lld\n",sum[1]); 40 } 41 } 42 return 0; 43 }