题意

考虑一个操作会对一段时间内的询问产生影响,于是将线段树上的这段时间打上乘这个数的标记,最后dfs整颗线段树。

code:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
const int maxn=100010;
int T,n,mod;
int a[maxn],ans[maxn],mul[maxn<<2];
void build(int p,int l,int r)
{
mul[p]=1;
if(l==r)return;
int mid=(l+r)>>1;
build(ls(p),l,mid);build(rs(p),mid+1,r);
}
void change(int p,int l,int r,int ql,int qr,int k)
{
if(l>=ql&&r<=qr){mul[p]=mul[p]*k%mod;return;}
int mid=(l+r)>>1;
if(ql<=mid)change(ls(p),l,mid,ql,qr,k);
if(qr>mid)change(rs(p),mid+1,r,ql,qr,k);
}
void getquery(int p,int l,int r,int sum)
{
sum=sum*mul[p]%mod;
if(l==r){ans[l]=sum;return;}
int mid=(l+r)>>1;
getquery(ls(p),l,mid,sum);getquery(rs(p),mid+1,r,sum);
}
signed main()
{
scanf("%lld",&T);
while(T--)
{
memset(a,0,sizeof(a));
scanf("%lld%lld",&n,&mod);
build(1,1,n);
for(int i=1;i<=n;i++)
{
int op,x;scanf("%lld%lld",&op,&x);
if(op==1)a[i]=x;
else change(1,1,n,x,i-1,a[x]),a[x]=0;
}
for(int i=1;i<=n;i++)if(a[i])change(1,1,n,i,n,a[i]);
getquery(1,1,n,1);
for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);
}
return 0;
}

最新文章

  1. 第九章伪代码编程过程 The PseudoCode Programming Process
  2. Innodb行锁源码学习(一)
  3. python练习之购物车脚本
  4. 网络包处理工具NetBee
  5. Mysql存储过程简明使用
  6. 获取EntityFrameWork返回的错误和ModelState中的错误
  7. 390. Elimination Game
  8. c# try..... catch
  9. VB 活动添加item元素
  10. poco vs Boost
  11. Android布局优化之层级优化
  12. PHP函数和数组
  13. jQuery_serialize的用法
  14. react项目构建
  15. yii 动态增加路由规则
  16. [Codeforces741D]Arpa&#39;s letter-marked tree and Mehrdad&#39;s Dokhtar-kosh paths——dsu on tree
  17. [No000015A]SQL语句分类
  18. 牛客网第一场E题 Removal
  19. button 和 submit 的区别
  20. debian9部署jenkins

热门文章

  1. 201871010111-刘佳华《面向对象程序设计(java)》第一周学习总结
  2. c++ 命令行执行
  3. 【oracle】表和索引建立在不用表空间原因
  4. npm 命令 --save 和 --save-dev 的区别
  5. super()方法详解
  6. TensorFlow2.0教程-使用keras训练模型
  7. Mybatis智能标签
  8. IT兄弟连 Java语法教程 流程控制语句 控制循环结构2
  9. 解决最新Java12 安装
  10. 01-String(键命令)