最后一个子任务过了,倒数第二个没过。。
#include <iostream>
#include <set>
using namespace std;
multiset<int> s, qwq;
int c;
int best(int x, bool seele) {
if (x < 0) return -1;
if(seele) s.erase(s.find(x));
int t = *(--s.upper_bound(c-1-x));
if (seele) s.insert(x);
return t;
}
void add(int x) {
int I, love, seele;
seele = best(love = best(I = best(x, 0), 1), 1);
if (I > 0 && x > love) {
qwq.insert(x+I);
if(love > 0 && I == seele) qwq.erase(qwq.find(love+seele));
}
s.insert(x);
}
void del(int x) {
int I, love, seele;
s.erase(s.find(x));
seele = best(love = best(I = best(x, 0), 1), 1);
if (I > 0 && x > love) {
qwq.erase(qwq.find(x+I));
if (love > 0 && I == seele) qwq.insert(love+seele);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, op, x, ans=0;
s.insert(-1);
qwq.insert(-1);
cin >> n >> c;
for (int i=1; i<=n; i++) {
cin >> op >> x;
op--;
x ^= ans;
x %= c;
op ? del(x) : add(x);
if (s.size() <= 2) {
cout << "EE\n";
ans=0;
continue;
}
auto it = --s.end();
cout << (ans = max((*it + *--it) % c, *(--qwq.end()))) << '\n';
}
}