玻璃弹珠
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

小灰灰有 n 个漂亮的小盒子,从左至右从 1n 编号。

小蓝很欣赏这些美丽的盒子,她拿出了她珍藏多年五颜六色的玻璃弹珠,她打算将各种颜色的弹珠放在小灰灰的盒子里。

小蓝不是一个慷慨的人,她想顺便考一考小灰灰,如果他回答错了,那小蓝就不给他玻璃弹珠了,甚至还要收走他的小盒子。

小蓝会依次进行 m 次操作,操作共有两类分为放置(op=1)和查询(op=2):

    第一类操作为四个空格分隔的整数 op\ L\ R\ col,代表小蓝给第 L 至第 R 个盒子中依次放置了一个 col 颜色的玻璃弹珠。
    第二类操作为三个空格分隔的整数 op\ L\ R,代表小蓝问小灰灰此时第 L 至第 RR-L+1 个盒子中共有多少种颜色的玻璃弹珠出现。

小灰灰不想失去自己的盒子,所以他想请你帮忙写个程序来回答小蓝的询问。

作为游戏的参与者之一,小灰灰也提出了要求,那就是小蓝的任意两个查询区间都不能相交(对放置操作的区间没有此要求)。即对于查询中的任意两个不同的查询区间,记先出现的查询区间为 [L_x, R_x],后出现的查询区间为 [L_y,R_y],必然有 R_x < L_y 成立或者 L_x > R_y 成立。

输入描述:

第一行两个空格分隔的整数分别代表 nm

接下来 m 行,每行若干个空格分隔的整数代表题面中描述出的两种操作之一。

保证:

0 < m , n\le 5\times 10^5

0 < op \le 2

0 < L, R, col \le n

L \le R

至少存在一次第二类操作(查询操作)。

输入数据量较大,请使用较快的读入方式。

输出描述:

输出若干行,第 i 行代表第 i 个询问的正确回答。
示例1

输入

复制
10 8
1 2 4 1
1 3 7 2
2 1 4
2 5 6
2 8 9
1 3 3 1
1 6 8 3
2 7 7

输出

复制
2
1
0
2