思路:针对一个数组的操作,即对一个区间。可以用线段树去进行维护。初始化建树,叶子节点的值为1,维护每段区间上各个元素的乘积sum。M yi,将第i个元素的值改为yi。N di,将第di个元素的值改为1。输出即查询区间[1,Q]的sum值。也就是变成了单点更新、区间查询问题。
#include<cstdio> #include<cstring> #include<queue> #include<cmath> #include<algorithm> #include<map> #include<vector> #include<string> #include<set> #include<iostream> #define ll long long #define lson p<<1 #define rson p<<1|1 using namespace std; const int maxn=1e5+100; ll mod; struct node { int l,r; ll sum; }t[maxn<<2]; void pushup(int p) { t[p].sum=(t[lson].sum*t[rson].sum)%mod; } void build(int p,int l,int r) { t[p].l=l,t[p].r=r; if(l==r) { t[p].sum=1; return ; } int mid=(l+r)>>1; build(lson,l,mid); build(rson,mid+1,r); pushup(p); } void update(int p,int k,ll val) { if(t[p].l==t[p].r) { t[p].sum=val; return ; } int mid=(t[p].l+t[p].r)>>1; if(k<=mid) update(lson,k,val); else update(rson,k,val); pushup(p); } int main() { int u; ios::sync_with_stdio(false); cin>>u; while(u--) { int n,m; cin>>n>>mod; build(1,1,n); for(int i=1;i<=n;i++) { char s; ll x; cin>>s; cin>>x; if(s=='M') update(1,i,x); else update(1,x,1); printf("%lld ",t[1].sum); } } }