珂朵莉树
#include <set>
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define IT set<node> :: iterator
#define ilL itl->L
#define ilR itl->R
#define ilw itl->w
struct node{
int L,R;
mutable int w;
node(int l, int r=-1, int v=0) : L(l),R(r),w(v) {}
bool operator< (const node &a) const { return L < a.L; }
};
set <node> s;
IT split(int pos){
IT mid = s.lower_bound(node(pos));
if(mid!=s.end() && pos==mid->L) return mid;
mid--;
int l = mid->L, r = mid->R, w = mid->w;
s.erase(mid);
s.insert(node(l,pos-1,w));
return s.insert(node(pos,r,w)).first;
}
void change(int l , int r, int w){
IT itl = split(l), itr = split(r+1);
s.erase(itl,itr);
s.insert(node(l,r,w));
}
void add(int l, int r, int k){
IT itl = split(l), itr = split(r+1);
for(;itl!=itr;++itl) ilw += k;
}
int Rank(int l, int r, int k){
vector <pair<int,int> > rk; rk.clear();
IT itl = split(l), itr = split(r+1);
for(;itl!=itr;itl++)
rk.push_back(pair<int,int>(ilw,ilR-ilL+1));
sort(rk.begin(),rk.end());
vector<pair<int,int> >::iterator it = rk.begin();
for(;it!=rk.end();it++){
k -= it->second;
if(k <= 0) return it->first;
}
}
int sum(int l, int r, int k){
IT itl = split(l), itr = split(r+1);
int Sum = 0;
for(;itl!=itr;++itl)
Sum += (ilR-ilL+1)*itw;
return Sum;
}
珂朵莉是世界上最幸福的女孩。