描述

小豆现在有一个数 xxx ,初始值为 111 。 小豆有 QQQ 次操作,操作有两种类型:

111 $ m$ : x=x×mx=x×mx=x×m ,输出 xxx modmodmod MMM ;

$2 $ pospospos: x=x/x=x/x=x/ 第$ pos$ 次操作所乘的数(保证第 pospospos 次操作一定为类型 111,对于每一个类型 111 的操作至多会被除一次),输出 xxx modmodmod MMM 。

输入

一共有 ttt 组输入。

对于每一组输入,第一行是两个数字 Q,MQ,MQ,M。

接下来 QQQ 行,每一行为操作类型 opopop ,操作编号或所乘的数字 mmm (保证所有的输入都是合法的)。

输出

对于每一个操作,输出一行,包含操作执行后的xxx modmodmod MMM 的值。

样例输入

1

10 1000000000

1 2

2 1

1 2

1 10

2 3

2 4

1 6

1 7

1 12

2 7

样例输出

2

1

2

20

10

1

6

42

504

84

对于 2020%20的数据,$ 1\leq Q \leq 500 $ ;

对于 100100%100 的数据, 1≤Q≤105,t≤5,M≤1091\leq Q \leq 10^5 , t\leq 5 , M \leq 10^91≤Q≤105,t≤5,M≤109

这个题可以看出是一道用线段树维护根节点区间乘积的题,由于QQQ的值很小,所以可以设线段树的根节点的左右指针为T[1].l=1,T[1].r=QT[1].l=1,T[1].r=QT[1].l=1,T[1].r=Q,当最初没有修改时,所有叶子结点的值都为111,那么整个区间的乘积就为111,即题上的xxx,对于操作111,我们让第iii个叶节点对应第iii次操作,如果第iii次操作为操作111,那么我们将第iii个叶节点的值改为mmm,否则第iii次操作是操作222,此时我们只需要将第pospospos个根节点改回111即可。

具体的代码实现:

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 100005
using namespace std;
int t,n;
long long mod;
inline long long read(){
	long long ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
	return ans;
}
struct Node{int l,r;long long mul;}T[N<<2];
inline void pushup(int p){T[p].mul=T[lc].mul*T[rc].mul%mod;}
inline void build(int p,int l,int r){
	T[p].l=l,T[p].r=r,T[p].mul=1;
	if(l==r)return;
	build(lc,l,mid);
	build(rc,mid+1,r);
}
inline void update(int p,int k,int v){
	if(T[p].l==T[p].r){
		T[p].mul=v;
		return;
	}
	if(k<=mid)update(lc,k,v);
	else update(rc,k,v);
	pushup(p);
}
int main(){
	t=read();
	while(t--){
		n=read(),mod=read();
		build(1,1,n);
		for(int i=1;i<=n;++i){
			int op=read();
			if(op==1){long long v=read();update(1,i,v);}
			else{int pos=read();update(1,pos,1);}
			printf("%lld\n",T[1].mul);
		}
	}
	return 0;
}

2018.06.26「TJOI2018」数学计算(线段树)的更多相关文章

  1. 「CQOI2006」简单题 线段树

    「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...

  2. LOJ2319. 「NOIP2017」列队【线段树】

    LINK 思路 神仙线段树 你考虑怎么样才能快速维护出答案 首先看看一条链怎么做? 首先很显然的思路是维护每个节点的是否出过队 然后对于重新入队的点 直接在后面暴力vector存一下就可以了 最核心的 ...

  3. 洛谷P4588 [TJOI2018]数学计算(线段树)

    题意 题目链接 Sol TJOI怎么全是板子题 对时间开个线段树,然后就随便做了.... #include<bits/stdc++.h> using namespace std; cons ...

  4. 2018.11.01 loj#2319. 「NOIP2017」列队(线段树)

    传送门 唉突然回忆起去年去noipnoipnoip提高组试水然后省二滚粗的悲惨经历... 往事不堪回首. 所以说考场上真的有debuffdebuffdebuff啊!!!虽然当时我也不会权值线段树 这道 ...

  5. BZOJ5334:[TJOI2018]数学计算(线段树)

    Description 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型:  1 m: x = x  *  m ,输出 x%mod; 2 pos: x = x /  第pos次操作所乘 ...

  6. [TJOI2018]数学计算 线段树

    ---题面--- 题解: ,,,考场上看到这题,没想到竟然是省选原题QAQ,考场上把它当数学题想了好久,因为不知道怎么处理有些数没有逆元的问题....知道这是线段树后恍然大悟. 首先可以一开始就建出一 ...

  7. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  8. 「洛谷3870」「TJOI2009」开关【线段树】

    题目链接 [洛谷] 题解 来做一下水题来掩饰ZJOI2019考炸的心情QwQ. 很明显可以线段树. 维护两个值,\(Lazy\)懒标记表示当前区间是否需要翻转,\(s\)表示区间还有多少灯是亮着的. ...

  9. LOJ2255. 「SNOI2017」炸弹 (线段树)

    本文为线段树做法 (听说可以tarjan缩点+拓扑? 感觉差不多..而且这样看起来方便很多 找到左端点的过程可以看作 点 -> 区间内lowerbound最小的点 -> lowerboun ...

随机推荐

  1. chase

    chase 英[tʃeɪs] 美[tʃes] vt. 追求; 追捕; 追寻; 镂刻; n. 追捕; 打猎; 猎物(指鸟兽等); 槽; vi. 追逐,追赶; 追寻; 追求(常与after连用); [口语 ...

  2. CSS3实现图片循环旋转

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. 小服务程序(Java Servlet)

    一般来说,servlet说起来挺高大上的,但是其实实际就是一个能够交互地浏览和修改页面数据,生成一个动态的Web页面. Servlet方法,页面实施请求数据,后台服务器给出响应,将数据返回到页面中去. ...

  4. C#判断文件和文件夹是否存在 不存在则创建

    using System.IO;string path = @"D:\accountDaoRu\";        if (Directory.Exists(path) == fa ...

  5. EntityFramework的linq扩展where

    代码 using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; ...

  6. [z]重建索引

    https://blog.csdn.net/funnyfu0101/article/details/52961485 所有执行的结果是脚本命令集合,可以用来创建索引: a)在plsql中使用execu ...

  7. Apache Commons configuration使用入门

    使用Commons  Configuration可以很好的管理我们的配置文件的读写, 官网:http://commons.apache.org/configuration 需要用到commons-la ...

  8. JAVA课堂练习-动手动脑--数组

    1.阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. 源代码: public class PassArray { public stat ...

  9. Next generation sequencing (NGS)二代测序数据预处理与分析

    二代测序原理: 1.DNA待测文库构建. 超声波把DNA打断成小片段,一般200--500bp,两端加上不同的接头2.Flowcell.一个flowcell,8个channel,很多接头3.桥式PCR ...

  10. 判断\r\n结束标准

    ucPrev==0x0D&&ucCur==0x0A \r\n uint8_t ucPrev =0,ucCur = 0; uint32_t recvlen = 0; for (; uiL ...