线段树是一种特殊的二叉树,满足以下性质:
每个点和一个区间对应,且有一个整数权值;
根节点对应的区间是[1,n];
如果一个点对应的区间是[l,r],且l<r,那么它的左孩子和右孩子分别对应区间[l,m]和[m+1,r],其中m=floor((l+r)/2)(floor表示向下取整);
如果一个点对应的区间是[l,r],且l=r,那么这个点是叶子;
如果一个点不是叶子,那么它的权值等于左孩子和右孩子的权值之和。
你需要维护一棵线段树,叶子的权值初始为0,接下来会进行m次操作:
操作1:给出l,r,a,对每个x(l≤x≤r),将[x,x]对应的叶子的权值加上a,非叶节点的权值相应变化;
操作2:给出l,r,a,询问有多少个线段树上的点,满足这个点对应的区间被[l,r]包含,且权值小于等于a。
输入描述:
第一行两个整数n,m
接下来m行,每行包含四个整数op,l,r,a,表示一次操作,其中op表示操作类型
1≤n,m≤100000
1≤l≤r≤n
1≤op≤2
-100000≤a≤100000
输出描述:
对每个操作2,输出一行,包含一个整数表示答案
示例1
输入
复制
3 3
1 2 3 9
2 1 2 1
2 1 3 1