这道题带懒标记的fhq能否可以做出来啊。
我尝试了一下只有10分QAQ
有哪位大佬能帮忙改一下吗QAQ
题解里好像没有带懒标记fhq
#include <stdio.h>
#include <iostream>
const long long N = 3e5 + 5;
const unsigned long long seed = 242520131;
unsigned long long keyword = 1;
struct node {
long long size, key;
long long val, tag;
long long l, r;
} fhq[N];
long long n, min, m, cnt, root, x, y, leave;
void update(long long rt) {
fhq[rt].size = fhq[fhq[rt].l].size + fhq[fhq[rt].r].size + 1;
return ;
}
void updown(long long rt) {
if(fhq[rt].tag) {
fhq[fhq[rt].l].tag += fhq[rt].tag;
fhq[fhq[rt].r].tag += fhq[rt].tag;
fhq[fhq[rt].l].val += fhq[rt].tag;
fhq[fhq[rt].r].val += fhq[rt].tag;
fhq[rt].tag = 0;
}
return ;
}
long long merge(long long x, long long y) {
if(!x || !y) return x + y;
updown(x), updown(y);
if(fhq[x].key >= fhq[y].key) {
fhq[x].r = merge(fhq[x].r, y);
update(x);
return x;
}
else {
fhq[y].l = merge(x, fhq[y].l);
update(y);
return y;
}
}
void split(long long now, long long &x, long long &y, long long val) {
if(!now) {
x = y = 0;
return ;
}
updown(now);
if(fhq[now].val <= val) {
x = now;
split(fhq[now].r, fhq[now].r, y, val);
update(x);
}
else {
y = now;
split(fhq[now].l, x, fhq[now].l, val);
update(y);
}
return ;
}
long long new_node(long long val) {
fhq[++cnt].val = val;
fhq[cnt].size = 1;
fhq[cnt].key = int(keyword *= seed);
return cnt;
}
void ins(long long val) {
split(root, x, y, val - 1);
root = merge(merge(x, new_node(val)), y);
return ;
}
void getnum(long long k) {
split(root, x, y, min - 1);
leave += fhq[x].size;
root = y;
if(fhq[root].size < k) {
std :: cout << -1 << '\n';
return ;
}
long long p = root;
while(p) {
if(fhq[fhq[p].r].size + 1 == k)
break;
if(fhq[fhq[p].r].size < k)
k -= fhq[fhq[p].r].size + 1, p = fhq[p].l;
else
p = fhq[p].r;
}
std :: cout << fhq[p].val << '\n';
return ;
}
signed main() {
std :: ios :: sync_with_stdio(false);
std :: cin >> n >> min;
char opt;
long long x;
for(long long i = 1; i <= n; ++i) {
std :: cin >> opt >> x;
if(opt == 'I') {
if(x < min) {
++leave;
continue;
}
ins(x);
}
if(opt == 'A') {
fhq[root].tag += x;
fhq[root].val += x;
}
if(opt == 'S') {
fhq[root].tag -= x;
fhq[root].val -= x;
split(root, x, y, min - 1);
root = y;
leave += fhq[x].size;
}
if(opt == 'F') {
getnum(x);
}
}
std :: cout << leave << '\n';
return 0;
}