珂朵莉是世界上最幸福的女孩!!!
JUST存个板子,方便以后用
记得处理好set::iterator == set::begin()/end()
的情况!
namespace ct{
struct node{
int l, r;
mutable int val;
node (int lpos): l(lpos) {}
node (int lpos, int rpos, int vall): l(lpos), r(rpos), val(vall) {}
bool operator< (const node &a) const { return l < a.l; }
};
set<node> s;
using sit = set<node>::iterator;
//^ChthollyTree-SetSplit
sit split(int pos){
sit it = s.lower_bound(node(pos));
if(it != s.end() && it -> l == pos) return it;
--it;
int l = it -> l, r = it -> r, val = it -> val;
s.erase(it);
if(l <= pos - 1) s.insert(node(l, pos - 1, val));
if(r >= pos) return s.insert(node(pos, r, val)).first;
return s.end();
}
//^ChthollyTree-PartValueAssign
void assign(int l, int r, int val){
sit itr = split(r + 1), itl = split(l);
s.erase(itl, itr);
s.insert(node(l, r, val));
}
//^ChthollyTree-PartValueAddition
void add(int l, int r, int val){
sit itr = split(r + 1), itl = split(l);
while(itl != itr) itl -> val += val, itl++;
}
//^ChthollyTree-Get_K-th_Value
int kth(int l, int r, int k){
sit itr = split(r + 1), itl = split(l);
vector<pair<int, int>> v;
v.clear();
for(sit it = itl; it != itr; it++) v.emplace_back(make_pair(it -> val, it -> r - it -> l + 1));
sort(v.begin(), v.end());
for(int i = 0; i < v.size(); i++){
k -= v[i].second;
if(k <= 0) return v[i].first;
}
return -1;
}
//^ChthollyTree-SinglePointQuery
sit query(int pos){
auto it = prev(s.upper_bound(pos));
return it;
}
//^ChthollyTree-PartQuery
int query_part(int l, int r, int x, int y){
sit itr = split(r + 1), itl = split(l);
int res(0);
for(sit it = itl; it != itr; it++) res += it -> val;
return res;
}
}