题目描述
有 N N N个位置, M M M个操作。操作有两种,每次操作如果是1 a b c
的形式表示在第 a a a个位置到第 b b b个位置,每个位置加入一个数 c c c。如果是2 a b c
,表示询问从第 a a a个位置到第 b b b个位置,第 c c c大的数是多少。
输入格式
第一行 N , M N,M N,M,接下来 M M M行,每行形如1 a b c
或2 a b c
输出格式
输出每个询问的结果
样例
样例输入
2 5
1 1 2 1
1 1 2 2
2 1 1 2
2 1 1 1
2 1 2 3
样例输出
1
2
1
题解
前置知识:整体二分
如果掌握了整体二分,这道题就会变得十分简单。
首先,整体二分中有插入、删除和查询三种操作,但这道题显然只需要插入和查询两种操作。不过,整体二分模板中的插入是单点插入,但这题是区间插入。所以我们就要将维护当前状态的数状数组改为线段树,这样维护当前状态有利于区间修改。其他部分与整体二分模板相同。时间复杂度为 O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)
code
#include<bits/stdc++.h>
#define lc k<<1
#define rc k<<1|1
using namespace std;
int n,m,gs;
long long num[50005];
struct node{
int x,y,tp,id,ans;
long long z,now;
}w[100005],w1[100005],w2[