Scx117
只一眼,便辽阔了时间。

题意:操作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 }
View Code

 

posted on 2018-06-13 14:15  Scx117  阅读(139)  评论(0编辑  收藏  举报