#include <bits/stdc++.h>
// #define int long long
using namespace std;
using ll = long long;
const ll MOD = 1000000007LL;
const int BUF_SZ = 1 << 15;
inline namespace Input {
char buf[BUF_SZ];
int pos = 0;
int len = 0;
char next_char() {
if (pos == len) {
pos = 0;
len = (int)fread(buf, 1, BUF_SZ, stdin);
if (!len) { return EOF; }
}
return buf[pos++];
}
// đọc 64-bit signed
ll read_ll() {
ll x = 0;
char ch;
int sgn = 1;
// skip đến digit hoặc dấu '-'
while (!isdigit(ch = next_char())) {
if (ch == '-') { sgn = -1; break; }
}
// nếu vừa gặp '-', lấy char tiếp theo (nếu là EOF thì behavior như cũ của bạn)
if (ch == '-') ch = next_char();
x = ch - '0';
while (isdigit(ch = next_char())) {
x = x * 10 + (ch - '0');
}
return x * sgn;
}
} // namespace Input
inline namespace Output {
char buf[BUF_SZ];
int pos = 0;
void flush_out() {
fwrite(buf, 1, pos, stdout);
pos = 0;
}
void write_char(char c) {
if (pos == BUF_SZ) flush_out();
buf[pos++] = c;
}
void write_ll(ll x) {
static char num_buf[100];
if (x < 0) write_char('-');
// chuyển sang unsigned để xử lý LLONG_MIN đúng
unsigned long long ux = x < 0 ? (unsigned long long)(-(x + 1)) + 1ULL : (unsigned long long)x;
int len = 0;
while (ux >= 10ULL) {
num_buf[len++] = char('0' + (ux % 10ULL));
ux /= 10ULL;
}
write_char(char('0' + ux));
while (len) write_char(num_buf[--len]);
write_char('\n');
}
void init_output() { assert(atexit(flush_out) == 0); }
} // namespace Output
struct mem{
int x, y, z;
};
mem a[150001];
vector<int> luu[600005];
vector<pair<int, int>> tr[600005];
int inf = -1e18;
struct pst{
struct Node{
int val;
int l, r;
Node(int v){
val = v;
l = -1, r= -1;
}
};
vector<Node> luu;
void clear(){
luu.clear();
}
int build(int start, int end){
if(start==end){
Node tmp(inf);
luu.push_back(tmp);
return luu.size()-1;
}else{
int mid = (start+end)/2;
Node tmp(inf);
int t = build(start, mid);
int p = build(mid+1, end);
tmp.l = t, tmp.r = p;
luu.push_back(tmp);
return luu.size()-1;
}
}
int update(int start, int end, int p, int x, int id){
if(start==end){
Node tmp(0);
tmp.val = luu[id].val;
tmp.val = max(tmp.val, x);
luu.push_back(tmp);
return luu.size()-1;
}else{
int mid = (start+end)/2;
Node tmp(0);
tmp.val = luu[id].val;
tmp.l = luu[id].l, tmp.r = luu[id].r;
if(p<=mid){
int tr = update(start, mid, p, x, luu[id].l);
tmp.l = tr;
}else{
int tr = update(mid+1, end, p, x, luu[id].r);
tmp.r = tr;
}
tmp.val = max(luu[tmp.l].val, luu[tmp.r].val);
luu.push_back(tmp);
return luu.size()-1;
}
}
int query(int start, int end, int l, int r, int id){
if(start > r or end<l)return inf;
if(l<=start and end<=r){
return luu[id].val;
}
int mid = (start+end)/2;
return max(query(start, mid, l, r, luu[id].l), query(mid+1,end, l, r, luu[id].r));
}
};
pst cay[600005];
vector<int> seg[600005];
vector<int> pf[600005], lz[600005]; //X
void merge(vector<pair<int, int>> &a, vector<pair<int, int>> &b, vector<pair<int, int>> &c, int node){
int i = 1, j = 1;
while(i<a.size() and j<b.size()){
if(a[i] < b[j]){
c.push_back(a[i]);
pf[node].push_back(pf[2*node][i]);
i++;
}else{
c.push_back(b[j]);
pf[node].push_back(pf[2*node+1][j]);
j++;
}
}
while(i<a.size()){
c.push_back(a[i]);
pf[node].push_back(pf[2*node][i]);
i++;
}
while(j<b.size()){
c.push_back(b[j]);
pf[node].push_back(pf[2*node+1][j]);
j++;
}
}
void merge2(vector<int> &a, vector<int> &b, vector<int> &c){
int i = 1, j = 1;
while(i<a.size() and j<b.size()){
if(a[i] < b[j]){
c.push_back(a[i]);
i++;
}else{
c.push_back(b[j]);
j++;
}
}
while(i<a.size()){
c.push_back(a[i]);
i++;
}
while(j<b.size()){
c.push_back(b[j]);
j++;
}
}
void reset(int node, int start, int end){
tr[node].clear();
luu[node].clear();
pf[node].clear();
lz[node].clear();
seg[node].clear();
cay[node].clear();
if(start!=end){
int mid = (start+end)/2;
reset(2*node, start, mid);
reset(2*node+1, mid+1, end);
}
}
void build(int node, int start, int end){
tr[node].push_back({-1, -1});
luu[node].push_back(-1);
pf[node].push_back(-1);
lz[node].push_back(-1);
if(start==end){
pf[node].push_back(a[start].x);
tr[node].push_back({a[start].y, a[start].z});
luu[node].push_back(a[start].z);
lz[node].push_back(a[start].z);
int m=tr[node].size()-1;
int root = cay[node].build(1, m);
seg[node].push_back(root);
for (int i = 1;i<=m;++i){
int p = lower_bound(luu[node].begin(), luu[node].end(), tr[node][i].second)-luu[node].begin();
int nr = cay[node].update(1, m, p, pf[node][i], seg[node].back());
seg[node].push_back(nr);
}
}else{
int mid = (start+end)/2;
build(2*node, start, mid);
build(2*node+1, mid+1, end);
merge(tr[2*node], tr[2*node+1], tr[node], node);
merge2(luu[2*node], luu[2*node+1], luu[node]);
int m=tr[node].size()-1;
int root = cay[node].build(1, m);
seg[node].push_back(root);
for (int i = 1;i<=m;++i){
int p = lower_bound(luu[node].begin(), luu[node].end(), tr[node][i].second)-luu[node].begin();
int nr = cay[node].update(1, m, p, pf[node][i], seg[node].back());
seg[node].push_back(nr);
}
for (int i = 1;i<=m;++i){
lz[node].push_back(tr[node][i].second);
lz[node][i] = max(lz[node][i], lz[node][i-1]);
}
}
}
int q1(int node, int start, int end, int l, int r, int y){
if(start > r or end < l){
return -1;
}else if (l<=start and end<=r){
int p = lower_bound(tr[node].begin(), tr[node].end(), make_pair(y, (int)-1))-tr[node].begin()-1;
return lz[node][p];
}else{
int mid= (start+end)/2;
return max(q1(2*node, start, mid, l, r, y), q1(2*node+1, mid+1, end, l, r, y));
}
}
int q2(int node, int start, int end, int l, int r, int y, int z){
if(start > r or end < l){
return inf;
}
if(l<=start and end<=r){
int p = lower_bound(tr[node].begin(), tr[node].end(), make_pair(y, (int)-1))-tr[node].begin()-1;
int m = tr[node].size()-1;
int q = lower_bound(luu[node].begin(), luu[node].end(), z)-luu[node].begin()-1;
int sol = cay[node].query(1, m, 1, q, seg[node][p]);
return sol;
}
int mid = (start+end)/2;
return max(q2(2*node, start, mid, l, r, y, z), q2(2*node+1, mid+1, end, l, r, y, z));
}
signed main(){
// ios_base::sync_with_stdio(0);
// cin.tie(0);
// freopen("team_contest.inp","r",stdin);
// freopen("team_contest.out","w",stdout);
init_output();
int n;
// cin >> n;
n = read_ll();
for (int i = 1;i<=n;++i){
// cin >> a[i].x >> a[i].y >> a[i].z;
a[i].x = read_ll();
a[i].y = read_ll();
a[i].z = read_ll();
}
sort(a+1, a+n+1, [](mem p, mem q){
return p.x < q.x;
});
int tro = 1;
build(1, 1, n);
int res = -1;
for (int i = 2;i<=n;++i){
while(tro<=n and a[tro].x<=a[i].x){
tro++;
}
int mz = q1(1, 1, n, 1, i-1, a[i].y);
if(mz >a[i].z){
int sol = q2(1, 1, n, tro, n, a[i].y, mz);
if(sol!=inf){
res = max(res, a[i].y + mz + sol);
}
}
}
reset(1, 1, n);
for (int i = 1;i<=n;++i){
swap(a[i].y, a[i].z);
}
tro = 1;
build(1, 1, n);
// int res = 0;
for (int i = 2;i<=n;++i){
while(tro<=n and a[tro].x<=a[i].x){
tro++;
}
int mz = q1(1, 1, n, 1, i-1, a[i].y);
if(mz > a[i].z){
int sol = q2(1, 1, n, tro, n, a[i].y, mz);
if(sol!=inf){
res = max(res, a[i].y + mz + sol);
}
}
}
write_ll(res);
}
Compilation message (stderr)
team.cpp:77:11: warning: overflow in conversion from 'double' to 'int' changes value from '-1.0e+18' to '-2147483648' [-Woverflow]
77 | int inf = -1e18;
| ^~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |