BZOJ5334: [Tjoi2018]数学计算
BZOJ5334: [Tjoi2018]数学计算
https://lydsy.com/JudgeOnline/problem.php?id=5334
分析:
- 线段树按时间分治即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 100050
#define ls p<<1
#define rs p<<1|1
int mod;
typedef long long ll;
int n,bg[N],ed[N],op[N],xx[N],M;
ll tr[N<<2];
void build(int l,int r,int p) {
tr[p]=1;
if(l==r) return ;
int mid=(l+r)>>1;
build(l,mid,ls); build(mid+1,r,rs);
}
void update(int l,int r,int x,int y,int v,int p) {
if(x<=l&&y>=r) {
tr[p]=tr[p]*v%mod; return ;
}
int mid=(l+r)>>1;
if(x<=mid) update(l,mid,x,y,v,ls);
if(y>mid) update(mid+1,r,x,y,v,rs);
}
void dfs(int l,int r,int p,ll now) {
now=now*tr[p]%mod;
if(l==r) {printf("%lld\n",now); return ;}
int mid=(l+r)>>1;
dfs(l,mid,ls,now); dfs(mid+1,r,rs,now);
}
void solve() {
scanf("%d%d",&n,&mod);
int i;
for(i=1;i<=n;i++) {
scanf("%d",&op[i]);
if(op[i]==1) {
scanf("%d",&xx[i]);
bg[i]=i, ed[i]=n;
}else {
scanf("%d",&xx[i]);
ed[xx[i]]=i-1;
}
}
build(1,n,1);
for(i=1;i<=n;i++) {
if(op[i]==1) {
update(1,n,bg[i],ed[i],xx[i],1);
}
}
dfs(1,n,1,1);
}
int main() {
int T;
scanf("%d",&T);
while(T--) solve();
}