P4588 [TJOI2018]数学计算

Jennie
显然可以模拟,但是谁会喜欢写高精和逆元呢?

需要撤销乘法操作,该怎么做呢

如果说一个个乘法结合起来的话,那么撤销就是把一个数变成1

那么就是一个线段树的问题了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int tree[400005];
int t;
int q,mod;
int f,x;
void pushup(int r){
	tree[r]=tree[r<<1]*tree[r<<1|1]%mod;
}
void chan(int ro,int l,int r,int L,int R,int key){
	if(L<=l&&r<=R){
		tree[ro]=key%mod;
		return ;
	}
	int mid=(l+r)>>1;
	if(L<=mid) chan(ro<<1,l,mid,L,R,key);
	if(R>mid) chan(ro<<1|1,mid+1,r,L,R,key);
	pushup(ro); 
}

signed main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&q,&mod);
		for(int i=1;i<=q;++i){
			chan(1,1,q,i,i,1);
		} 
		for(int i=1;i<=q;++i){
			scanf("%d%d",&f,&x);
			if(f==1){
				chan(1,1,q,i,i,x);
				cout<<tree[1]<<endl;
			}else{
				chan(1,1,q,x,x,1);
				cout<<tree[1]<<endl;
			}
		}
	}
	return 0;
}
posted @ 2021-09-25 15:55  Simex  阅读(31)  评论(0编辑  收藏  举报