#include <algorithm>
#include <iostream>
#include <assert.h>
#include <cmath>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef pair<ll, ll> pll;
const int MAX = 1e9+7;
const int MIN = -1e9+7;
struct node{
int key = 0;
int p = 0; //priority
int size = 1; //number of nodes in subtree
int cost = (int) MIN;
ll total_cost = (ll) MIN; //total of costs in subtree
int max_cost = (int) MIN;
int add = 0;
node *left = NULL;
node *right = NULL;
node *parent = NULL;
node(): left(NULL), right(NULL), parent(NULL){
p = rand() % (int)MAX;
}
node(int key): key(key), left(NULL), right(NULL), parent(NULL){
p = rand() % (int)MAX;
}
node(int key, int cost): key(key), cost(cost), left(NULL), right(NULL), parent(NULL){
p = rand() % (int)MAX;
total_cost = (ll)cost;
max_cost = cost;
}
static void set_right_parent(node *child, node *parent){
if (parent == NULL) return;
parent->right = child;
if (child != NULL) child->parent = parent;
}
static void set_left_parent(node *child, node *parent){
if (parent == NULL) return;
parent->left = child;
if (child != NULL) child->parent = parent;
}
static void recalc(node *n){
if (n == NULL) return;
int total = 1;
int total_cost = (ll)n->cost;
int max_cost = n->cost;
if (n->left != NULL){
total += n->left->size;
total_cost += n->left->total_cost;
max_cost = max({max_cost, n->left->max_cost});
}
if (n->right != NULL){
total += n->right->size;
total_cost += n->right->total_cost;
max_cost = max({max_cost, n->right->max_cost});
}
n->size = total;
n->total_cost = total_cost;
n->max_cost = max_cost;
}
static int sizeOf(node *n){
if (n == NULL) return 0;
else return n->size;
}
static void relay_add(node *n){
if (n == NULL) return;
n->cost += n->add;
if (n->left != 0) n->left->add += n->add;
if (n->right != 0) n->right->add += n->add;
n->add = 0;
}
};
class Treap{
public:
Treap():root(NULL) {
}
Treap(node *root): root(root) {
}
~Treap() { }
void insert(int x, int cost){
node *l;
node *r;
Treap::split(root, x, l, r);
node *n = new node(x, cost);
root = Treap::merge(l, n);
root = Treap::merge(root, r);
}
void remove(int x){
node *l;
node *r;
Treap::split(root, x-1, l, r);
node *ml;
node *mr;
Treap::split(r, x, ml, mr);
root = Treap::merge(l, mr);
}
node* find_kth(int k){
node *cur = root;
while(cur != NULL){
int size = node::sizeOf(cur->left);
if (size == k){
break;
}
else if (size > k){
cur = cur->left;
} else {
cur = cur->right;
k -= size + 1;
}
}
return cur;
}
ll total_cost(int l, int r){
node *fl;
node *fr;
Treap::split(root, l-1, fl, fr);
node *ml;
node *mr;
Treap::split(fr, r, ml, mr);
ll res = ml->total_cost + ml->add*ml->size;
root = Treap::merge(ml, mr);
root = Treap::merge(root, fl);
return res;
}
int max_cost(int l, int r){
node *fl;
node *fr;
Treap::split(root, l-1, fl, fr);
node *ml;
node *mr;
Treap::split(fr, r, ml, mr);
ll res = ml->max_cost + ml->add;
root = Treap::merge(ml, mr);
root = Treap::merge(root, fl);
return res;
}
void traverse(){
inorder(root);
}
void add(int val, int l, int r){//add val to cost of each element in interval from l to r
node *fl;
node *fr;
Treap::split(root, l-1, fl, fr);
node *ml;
node *mr;
Treap::split(fr, r, ml, mr);
ml->add = val;
root = Treap::merge(ml, mr);
root = Treap::merge(root, fl);
}
private:
node *root = NULL;
static void split(node *cur, int key, node* &l, node* &r){
if (cur == NULL) {
l = NULL;
r = NULL;
return;
}
node::relay_add(cur);
if (cur->key > key){
node *newr = NULL;
if (cur->left == NULL){
l = NULL;
}
else {
Treap::split(cur->left, key, l, newr);
}
node::set_left_parent(newr, cur);
r = cur;
node::recalc(r);
}
else {
node *newl = NULL;
if (cur->right == NULL){
r = NULL;
}
else {
Treap::split(cur->right, key, newl, r);
}
node::set_right_parent(newl, cur);
l = cur;
node::recalc(l);
}
}
static node* merge(node *l, node *r){
if (l == NULL) return r;
if (r == NULL) return l;
if (l->key > r->key) swap(l, r);
if (l->p > r->p){
node::relay_add(l);
node *right = Treap::merge(l->right, r);
node::set_right_parent(right, l);
node::recalc(l);
return l;
}
else {
node::relay_add(r);
node *left = Treap::merge(l, r->left);
node::set_left_parent(left, r);
node::recalc(r);
return r;
}
return NULL;
}
void inorder(node *cur){
if (cur == NULL) return;
inorder(cur->left);
cout << cur->key << " size: " << cur->size << " cost " << cur->cost << " total_cost " << cur->total_cost << " max_cost " << cur->max_cost << " add " << cur->add << endl;
inorder(cur->right);
}
};
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
Treap t;
t.insert(0, 1);
t.insert(1, 10);
cout << t.max_cost(1, 1) << endl;
t.insert(2, 40);
t.insert(3, 20);
cout << t.max_cost(0, 3) << endl;
cout << t.max_cost(0, 2) << endl;
cout << t.max_cost(0, 1) << endl;
/* code */
return 0;
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxjbWF0aD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxsbCwgbGw+IHBsbDsKCmNvbnN0IGludCBNQVggPSAxZTkrNzsKY29uc3QgaW50IE1JTiA9IC0xZTkrNzsKCnN0cnVjdCBub2RlewoJaW50IGtleSA9IDA7CglpbnQgcCA9IDA7IC8vcHJpb3JpdHkKCWludCBzaXplID0gMTsgLy9udW1iZXIgb2Ygbm9kZXMgaW4gc3VidHJlZQoJaW50IGNvc3QgPSAoaW50KSBNSU47CglsbCB0b3RhbF9jb3N0ID0gKGxsKSBNSU47IC8vdG90YWwgb2YgY29zdHMgaW4gc3VidHJlZQoJaW50IG1heF9jb3N0ID0gKGludCkgTUlOOwoJaW50IGFkZCA9IDA7Cglub2RlICpsZWZ0ID0gTlVMTDsKCW5vZGUgKnJpZ2h0ID0gTlVMTDsKCW5vZGUgKnBhcmVudCA9IE5VTEw7Cglub2RlKCk6IGxlZnQoTlVMTCksIHJpZ2h0KE5VTEwpLCBwYXJlbnQoTlVMTCl7CgkJcCA9IHJhbmQoKSAlIChpbnQpTUFYOwoJfQkKCW5vZGUoaW50IGtleSk6IGtleShrZXkpLCBsZWZ0KE5VTEwpLCByaWdodChOVUxMKSwgcGFyZW50KE5VTEwpewoJCXAgPSByYW5kKCkgJSAoaW50KU1BWDsKCX0KCW5vZGUoaW50IGtleSwgaW50IGNvc3QpOiBrZXkoa2V5KSwgY29zdChjb3N0KSwgbGVmdChOVUxMKSwgcmlnaHQoTlVMTCksIHBhcmVudChOVUxMKXsKCQlwID0gcmFuZCgpICUgKGludClNQVg7CgkJdG90YWxfY29zdCA9IChsbCljb3N0OwoJCW1heF9jb3N0ID0gY29zdDsKCX0KCXN0YXRpYyB2b2lkIHNldF9yaWdodF9wYXJlbnQobm9kZSAqY2hpbGQsIG5vZGUgKnBhcmVudCl7CgkJaWYgKHBhcmVudCA9PSBOVUxMKSByZXR1cm47CgkJcGFyZW50LT5yaWdodCA9IGNoaWxkOwoJCWlmIChjaGlsZCAhPSBOVUxMKSBjaGlsZC0+cGFyZW50ID0gcGFyZW50OwoJfQkKCXN0YXRpYyB2b2lkIHNldF9sZWZ0X3BhcmVudChub2RlICpjaGlsZCwgbm9kZSAqcGFyZW50KXsKCQlpZiAocGFyZW50ID09IE5VTEwpIHJldHVybjsKCQlwYXJlbnQtPmxlZnQgPSBjaGlsZDsKCQlpZiAoY2hpbGQgIT0gTlVMTCkgY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKCX0KCXN0YXRpYyB2b2lkIHJlY2FsYyhub2RlICpuKXsKCQlpZiAobiA9PSBOVUxMKSByZXR1cm47CgkJaW50IHRvdGFsID0gMTsKCQlpbnQgdG90YWxfY29zdCA9IChsbCluLT5jb3N0OwoJCWludCBtYXhfY29zdCA9IG4tPmNvc3Q7CgkJaWYgKG4tPmxlZnQgIT0gTlVMTCl7IAoJCQl0b3RhbCArPSBuLT5sZWZ0LT5zaXplOwoJCQl0b3RhbF9jb3N0ICs9IG4tPmxlZnQtPnRvdGFsX2Nvc3Q7CgkJCW1heF9jb3N0ID0gbWF4KHttYXhfY29zdCwgbi0+bGVmdC0+bWF4X2Nvc3R9KTsKCQl9CgkJaWYgKG4tPnJpZ2h0ICE9IE5VTEwpeyAKCQkJdG90YWwgKz0gbi0+cmlnaHQtPnNpemU7CgkJCXRvdGFsX2Nvc3QgKz0gbi0+cmlnaHQtPnRvdGFsX2Nvc3Q7CgkJCW1heF9jb3N0ID0gbWF4KHttYXhfY29zdCwgbi0+cmlnaHQtPm1heF9jb3N0fSk7CgkJfQoJCW4tPnNpemUgPSB0b3RhbDsKCQluLT50b3RhbF9jb3N0ID0gdG90YWxfY29zdDsKCQluLT5tYXhfY29zdCA9IG1heF9jb3N0OwoJfQoJc3RhdGljIGludCBzaXplT2Yobm9kZSAqbil7CgkJaWYgKG4gPT0gTlVMTCkgcmV0dXJuIDA7CgkJZWxzZSByZXR1cm4gbi0+c2l6ZTsKCX0KCXN0YXRpYyB2b2lkIHJlbGF5X2FkZChub2RlICpuKXsKCQlpZiAobiA9PSBOVUxMKSByZXR1cm47CgkJbi0+Y29zdCArPSBuLT5hZGQ7CgkJaWYgKG4tPmxlZnQgIT0gMCkgbi0+bGVmdC0+YWRkICs9IG4tPmFkZDsKCQlpZiAobi0+cmlnaHQgIT0gMCkgbi0+cmlnaHQtPmFkZCArPSBuLT5hZGQ7CgkJbi0+YWRkID0gMDsKCX0KfTsKCmNsYXNzIFRyZWFwewpwdWJsaWM6CglUcmVhcCgpOnJvb3QoTlVMTCkgewoJfQoJVHJlYXAobm9kZSAqcm9vdCk6IHJvb3Qocm9vdCkgewoJfQoJflRyZWFwKCkgeyB9Cgl2b2lkIGluc2VydChpbnQgeCwgaW50IGNvc3QpewoJCW5vZGUgKmw7CgkJbm9kZSAqcjsKCQlUcmVhcDo6c3BsaXQocm9vdCwgeCwgbCwgcik7CgkJbm9kZSAqbiA9IG5ldyBub2RlKHgsIGNvc3QpOwoJCXJvb3QgPSBUcmVhcDo6bWVyZ2UobCwgbik7CgkJcm9vdCA9IFRyZWFwOjptZXJnZShyb290LCByKTsKCX0KCXZvaWQgcmVtb3ZlKGludCB4KXsKCQlub2RlICpsOwoJCW5vZGUgKnI7CgkJVHJlYXA6OnNwbGl0KHJvb3QsIHgtMSwgbCwgcik7CgkJbm9kZSAqbWw7CgkJbm9kZSAqbXI7CgkJVHJlYXA6OnNwbGl0KHIsIHgsIG1sLCBtcik7CgkJcm9vdCA9IFRyZWFwOjptZXJnZShsLCBtcik7Cgl9Cglub2RlKiBmaW5kX2t0aChpbnQgayl7CgkJbm9kZSAqY3VyID0gcm9vdDsKCQl3aGlsZShjdXIgIT0gTlVMTCl7CgkJCWludCBzaXplID0gbm9kZTo6c2l6ZU9mKGN1ci0+bGVmdCk7CgkJCWlmIChzaXplID09IGspewoJCQkJYnJlYWs7CgkJCX0KCQkJZWxzZSBpZiAoc2l6ZSA+IGspewoJCQkJY3VyID0gY3VyLT5sZWZ0OwoJCQl9IGVsc2UgewoJCQkJY3VyID0gY3VyLT5yaWdodDsKCQkJCWsgLT0gc2l6ZSArIDE7CgkJCX0KCQl9CgkJcmV0dXJuIGN1cjsKCX0KCWxsIHRvdGFsX2Nvc3QoaW50IGwsIGludCByKXsKCQlub2RlICpmbDsKCQlub2RlICpmcjsKCQlUcmVhcDo6c3BsaXQocm9vdCwgbC0xLCBmbCwgZnIpOwoJCW5vZGUgKm1sOwoJCW5vZGUgKm1yOwoJCVRyZWFwOjpzcGxpdChmciwgciwgbWwsIG1yKTsKCQlsbCByZXMgPSBtbC0+dG90YWxfY29zdCArIG1sLT5hZGQqbWwtPnNpemU7CgkJcm9vdCA9IFRyZWFwOjptZXJnZShtbCwgbXIpOwoJCXJvb3QgPSBUcmVhcDo6bWVyZ2Uocm9vdCwgZmwpOwoJCXJldHVybiByZXM7Cgl9CQoJaW50IG1heF9jb3N0KGludCBsLCBpbnQgcil7CgkJbm9kZSAqZmw7CgkJbm9kZSAqZnI7CgkJVHJlYXA6OnNwbGl0KHJvb3QsIGwtMSwgZmwsIGZyKTsKCQlub2RlICptbDsKCQlub2RlICptcjsKCQlUcmVhcDo6c3BsaXQoZnIsIHIsIG1sLCBtcik7CgkJbGwgcmVzID0gbWwtPm1heF9jb3N0ICsgbWwtPmFkZDsKCQlyb290ID0gVHJlYXA6Om1lcmdlKG1sLCBtcik7CgkJcm9vdCA9IFRyZWFwOjptZXJnZShyb290LCBmbCk7CgkJcmV0dXJuIHJlczsKCX0KCXZvaWQgdHJhdmVyc2UoKXsKCQlpbm9yZGVyKHJvb3QpOwoJfQoJdm9pZCBhZGQoaW50IHZhbCwgaW50IGwsIGludCByKXsvL2FkZCB2YWwgdG8gY29zdCBvZiBlYWNoIGVsZW1lbnQgaW4gaW50ZXJ2YWwgZnJvbSBsIHRvIHIKCQlub2RlICpmbDsKCQlub2RlICpmcjsKCQlUcmVhcDo6c3BsaXQocm9vdCwgbC0xLCBmbCwgZnIpOwoJCW5vZGUgKm1sOwoJCW5vZGUgKm1yOwoJCVRyZWFwOjpzcGxpdChmciwgciwgbWwsIG1yKTsKCQltbC0+YWRkID0gdmFsOwoJCXJvb3QgPSBUcmVhcDo6bWVyZ2UobWwsIG1yKTsKCQlyb290ID0gVHJlYXA6Om1lcmdlKHJvb3QsIGZsKTsJCQoJfQpwcml2YXRlOgoJbm9kZSAqcm9vdCA9IE5VTEw7CglzdGF0aWMgdm9pZCBzcGxpdChub2RlICpjdXIsIGludCBrZXksIG5vZGUqICZsLCBub2RlKiAmcil7CgkJaWYgKGN1ciA9PSBOVUxMKSB7CgkJCWwgPSBOVUxMOwoJCQlyID0gTlVMTDsKCQkJcmV0dXJuOwoJCX0KCQlub2RlOjpyZWxheV9hZGQoY3VyKTsKCQlpZiAoY3VyLT5rZXkgPiBrZXkpewoJCQlub2RlICpuZXdyID0gTlVMTDsKCQkJaWYgKGN1ci0+bGVmdCA9PSBOVUxMKXsKCQkJCWwgPSBOVUxMOwoJCQl9CgkJCWVsc2UgewoJCQkJVHJlYXA6OnNwbGl0KGN1ci0+bGVmdCwga2V5LCBsLCBuZXdyKTsKCQkJfQkKCQkJbm9kZTo6c2V0X2xlZnRfcGFyZW50KG5ld3IsIGN1cik7CgkJCXIgPSBjdXI7CgkJCW5vZGU6OnJlY2FsYyhyKTsKCQl9CgkJZWxzZSB7CgkJCW5vZGUgKm5ld2wgPSBOVUxMOwoJCQlpZiAoY3VyLT5yaWdodCA9PSBOVUxMKXsKCQkJCXIgPSBOVUxMOwoJCQl9CgkJCWVsc2UgewoJCQkJVHJlYXA6OnNwbGl0KGN1ci0+cmlnaHQsIGtleSwgbmV3bCwgcik7CgkJCX0KCQkJbm9kZTo6c2V0X3JpZ2h0X3BhcmVudChuZXdsLCBjdXIpOwoJCQlsID0gY3VyOwoJCQlub2RlOjpyZWNhbGMobCk7CgkJfQoJfQoJc3RhdGljIG5vZGUqIG1lcmdlKG5vZGUgKmwsIG5vZGUgKnIpewoJCWlmIChsID09IE5VTEwpIHJldHVybiByOwoJCWlmIChyID09IE5VTEwpIHJldHVybiBsOwoJCWlmIChsLT5rZXkgPiByLT5rZXkpIHN3YXAobCwgcik7CgkJaWYgKGwtPnAgPiByLT5wKXsKCQkJbm9kZTo6cmVsYXlfYWRkKGwpOwoJCQlub2RlICpyaWdodCA9IFRyZWFwOjptZXJnZShsLT5yaWdodCwgcik7CgkJCW5vZGU6OnNldF9yaWdodF9wYXJlbnQocmlnaHQsIGwpOwoJCQlub2RlOjpyZWNhbGMobCk7CgkJCXJldHVybiBsOwoJCX0KCQllbHNlIHsKCQkJbm9kZTo6cmVsYXlfYWRkKHIpOwoJCQlub2RlICpsZWZ0ID0gVHJlYXA6Om1lcmdlKGwsIHItPmxlZnQpOwoJCQlub2RlOjpzZXRfbGVmdF9wYXJlbnQobGVmdCwgcik7CgkJCW5vZGU6OnJlY2FsYyhyKTsKCQkJcmV0dXJuIHI7CgkJfQoJCXJldHVybiBOVUxMOwoJfQoJdm9pZCBpbm9yZGVyKG5vZGUgKmN1cil7CgkJaWYgKGN1ciA9PSBOVUxMKSByZXR1cm47CgkJaW5vcmRlcihjdXItPmxlZnQpOwoJCWNvdXQgPDwgY3VyLT5rZXkgPDwgIiBzaXplOiAiIDw8IGN1ci0+c2l6ZSAgPDwgIiBjb3N0ICIgPDwgY3VyLT5jb3N0IDw8ICIgdG90YWxfY29zdCAiIDw8IGN1ci0+dG90YWxfY29zdCA8PCAiIG1heF9jb3N0ICIgPDwgY3VyLT5tYXhfY29zdCA8PCAiIGFkZCAiIDw8IGN1ci0+YWRkIDw8IGVuZGw7CgkJaW5vcmRlcihjdXItPnJpZ2h0KTsKCX0KfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pCnsKCWlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKCVRyZWFwIHQ7Cgl0Lmluc2VydCgwLCAxKTsKCXQuaW5zZXJ0KDEsIDEwKTsKCWNvdXQgPDwgdC5tYXhfY29zdCgxLCAxKSA8PCBlbmRsOwoJdC5pbnNlcnQoMiwgNDApOwoJdC5pbnNlcnQoMywgMjApOwoJY291dCA8PCB0Lm1heF9jb3N0KDAsIDMpIDw8IGVuZGw7Cgljb3V0IDw8IHQubWF4X2Nvc3QoMCwgMikgPDwgZW5kbDsKCWNvdXQgPDwgdC5tYXhfY29zdCgwLCAxKSA8PCBlbmRsOwoJLyogY29kZSAqLwoJcmV0dXJuIDA7Cn0K