【TJOI2018】数学计算
题目链接
没质数搞不了逆元。
发现2操作在去除之前某1操作的影响,然后要求维护连乘。
单点修改,区间询问。维护区间积。
上线段树。
区间询问还是全区间的,没有懒标记,没有查询函数。
代码(100分):
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<map> #include<set> #define IL inline #define RG register #define _1 first #define _2 second using namespace std; typedef long long LL; const int N=1e5; int n; LL mod,a[N+3]; LL s[N*4+3]; IL int ls(int i){return i<<1;} IL int rs(int i){return i<<1|1;} void mdf(int i,int l,int r,int p,LL x){ if(l==r){ s[i]=x; return ; } int mid=(l+r)>>1; if(p<=mid) mdf(ls(i),l,mid,p,x); else mdf(rs(i),mid+1,r,p,x); s[i]=s[ls(i)]*s[rs(i)]%mod; } IL void sol(){ scanf("%d%lld",&n,&mod); for(int i=1;i<=n*4;i++) s[i]=1; for(int i=1;i<=n;i++){ int opt; scanf("%d",&opt); if(opt==1){ LL m; scanf("%lld",&m); mdf(1,1,n,i,m); printf("%lld\n",s[1]); } else { int p; scanf("%d",&p); mdf(1,1,n,p,1); printf("%lld\n",s[1]); } } } int main(){ int t; scanf("%d",&t); while(t--) sol(); return 0; }