时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld
题目描述
小灰灰有

个漂亮的小盒子,从左至右从

至

编号。
小蓝很欣赏这些美丽的盒子,她拿出了她珍藏多年五颜六色的玻璃弹珠,她打算将各种颜色的弹珠放在小灰灰的盒子里。
小蓝不是一个慷慨的人,她想顺便考一考小灰灰,如果他回答错了,那小蓝就不给他玻璃弹珠了,甚至还要收走他的小盒子。
小蓝会依次进行

次操作,操作共有两类分为放置(

)和查询(

):
第一类操作为四个空格分隔的整数

,代表小蓝给第

至第

个盒子中依次放置了一个

颜色的玻璃弹珠。
第二类操作为三个空格分隔的整数

,代表小蓝问小灰灰此时第

至第

这

个盒子中共有多少种颜色的玻璃弹珠出现。
小灰灰不想失去自己的盒子,所以他想请你帮忙写个程序来回答小蓝的询问。
作为游戏的参与者之一,小灰灰也提出了要求,那就是小蓝的任意两个
查询区间都不能相交(对放置操作的区间没有此要求)。即对于查询中的任意两个不同的
查询区间,记先出现的查询区间为
![[L_x, R_x]](https://www.nowcoder.com/equation?tex=%5BL_x%2C%20R_x%5D)
,后出现的查询区间为
![[L_y,R_y]](https://www.nowcoder.com/equation?tex=%5BL_y%2CR_y%5D)
,必然有

成立或者

成立。
输入描述:
第一行两个空格分隔的整数分别代表
和
。
接下来
行,每行若干个空格分隔的整数代表题面中描述出的两种操作之一。
保证:
至少存在一次第二类操作(查询操作)。
输入数据量较大,请使用较快的读入方式。
输出描述:
输出若干行,第
行代表第
个询问的正确回答。
示例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