直接维护的行上列上最大次大最后判断,求个hack
#include<bits/stdc++.h>
#define ld long double
#define ull unsigned long long
#define int long long
#define pb push_back
#define mp make_pair
using namespace std;
inline int read()
{
int s=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) s=(s<<1)+(s<<3)+(c^48),c=getchar();
return s*w;
}
inline void write(int x,char ch)
{
if(x<0) x=-x,putchar('-');
static char stk[25]; int top=0;
do {stk[top++]=x%10+'0',x/=10;} while(x);
while(top) putchar(stk[--top]);
putchar(ch);
return;
}
inline void file()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
}
bool Mbe;
namespace MyTool
{
static const int Mod=998244353;
inline void Swp(int &a,int &b) {int t=a;a=b;b=t;}
inline int Max(int a,int b) {return (b&((a-b)>>63))|(a&(~(a-b)>>31));}
inline int Min(int a,int b) {return (a&((a-b)>>63))|(a&(~(a-b)>>31));}
template<typename T> inline void cmax(T &a,T b) {a=a>b?a:b;}
template<typename T> inline void cmin(T &a,T b) {a=a<b?a:b;}
inline int Abs(int a) {return (a^(a>>63))-(a>>63);}
inline void Madd(int &a,int b) {a=a+b>Mod?a+b-Mod:a+b;}
inline void Mdel(int &a,int b) {a=a-b<0?a-b+Mod:a-b;}
inline void Mmul(int &a,int b) {a=1ll*a*b%Mod;}
inline void Mmod(int &a) {a=(a%Mod+Mod)%Mod;}
inline int Cadd(int a,int b) {return a+b>=Mod?a+b-Mod:a+b;}
inline int Cdel(int a,int b) {return a-b<0?a-b+Mod:a-b;}
inline int Cmul(int a,int b) {return a*b%Mod;}
inline int Cmod(int a) {return (a%Mod+Mod)%Mod;}
inline int gcd(int a,int b) {return b?gcd(b,a%b):a;}
inline int qpow(int a,int b) {int res=1; while(b) {if(b&1) Mmul(res,a); Mmul(a,a); b>>=1;} return res;}
inline int qmul(int a,int b) {int res=0; while(b) {if(b&1) Madd(res,a); Madd(a,a); b>>=1;} return res;}
template<typename T> inline T pow(T x) {return x*x;}
}
using namespace MyTool;
namespace MyYouth
{
static const int MAX=200010;
static const int inf=2147483647;
static const int INF=4557430888798830399;
static const int mod=1e9+7;
static const int bas=131;
int n;
map<pair<int,int>,int> m;
unordered_map<int,int> sumx,sumy;
struct node{int x,y,val;}o[MAX];
int mx,my,x_,y_;
int cx,cy,x__,y__;
int ans;
inline void mian()
{
n=read();
for(int i=1;i<=n;++i) o[i].x=read(),o[i].y=read(),o[i].val=read();
for(int i=1;i<=n;++i)
{
sumx[o[i].x]+=o[i].val,sumy[o[i].y]+=o[i].val;
m[mp(o[i].x,o[i].y)]=o[i].val;
if(sumx[o[i].x]>=mx) cx=mx,x__=x_,mx=sumx[o[i].x],x_=o[i].x;
else if(sumx[o[i].x]>=cx) cx=sumx[o[i].x],x__=o[i].x;
if(sumy[o[i].y]>=my) cy=my,y__=y_,my=sumy[o[i].y],y_=o[i].y;
else if(sumy[o[i].y]>=cy) cy=sumy[o[i].y],y__=o[i].y;
}
ans=mx+my; if(m[mp(x_,y_)]) ans-=m[mp(x_,y_)];
if(m[mp(x__,y_)]) cmax(ans,cx+my-m[mp(x__,y_)]); else cmax(ans,cx+my);
if(m[mp(x_,y__)]) cmax(ans,mx+cy-m[mp(x_,y__)]); else cmax(ans,mx+cy);
if(m[mp(x__,y__)]) cmax(ans,cx+cy-m[mp(x__,y__)]); else cmax(ans,cx+cy);
write(ans,'\n');
return;
}
}
bool Med;
signed main()
{
// file();
fprintf(stderr,"%.3lf MB\n",(&Med-&Mbe)/1048576.0);
MyYouth::mian();
cerr<<1e3*clock()/CLOCKS_PER_SEC<<" ms\n";
return (0-0);
}