从一个发这道题题解的dalao那里学到好多QAQ
对于每一组的数据,把他们的初始值全部视为1,每一步要么把一个数设为其他值,要么把一个数设为1,所以就是个单点修改 ,要输出的是前面的乘积,也就是区间乘积。所以明显是线段树,(在我发现是线段树后想开摆时,在题解中发现了zkw树orz)
代码如下(示例):
#include <bits/stdc++.h>
#define int long long//需要把int main() 改为signed main()
using namespace std;
int ZKW[400005];
signed main(){
int T;
int Q,M,mod;
int a,b;
int Cg;
cin>>T;//T组输入
while(T--){
cin>>Q>>mod;//Q行,对mod取模
for(M=1;M<Q+2;M<<=1); //初始化,为zkw树留足够的位置
fill(ZKW+1,ZKW+3+M+Q,1); //树上所有值全设为1
for(int i=1;i<=Q;i++){
cin>>a>>b;
if(a==1) ZKW[Cg=M+i]=b;
else ZKW[Cg=M+b]=1;
while(Cg>>=1) ZKW[Cg]=ZKW[Cg<<1]*ZKW[Cg<<1|1]%mod;//单点修改
cout<<ZKW[1]<<endl;
//只需要前i段的乘积,所以不需要给这个zkw树设置两个哨兵了,因为答案就是ZKW[1]
}
}
return 0;
}