Submission #1281167

#TimeUsernameProblemLanguageResultExecution timeMemory
1281167denislavTeam Contest (JOI22_team)C++20
0 / 100
2095 ms4340 KiB
# include <iostream>
# include <vector>
# include <algorithm>
# include <set>
using namespace std;

const int MAX=2e5+11;

int n,q;
struct point
{
    int x,y,z;
}a[MAX];
bool cmpX(point A, point B)
{
    return A.x<B.x;
}
bool cmpY(point A, point B)
{
    return A.y<B.y;
}
bool cmpZ(point A, point B)
{
    return A.z<B.z;
}

int nY,nZ;
int realY[MAX];
int realZ[MAX];

struct segtree
{
    int N;
    int tree[MAX*4];

    void build(int v, int l, int r)
    {
        if(l==r)
        {
            tree[v]=0;
            return ;
        }

        int mid=(l+r)/2;
        build(v*2,l,mid);
        build(v*2+1,mid+1,r);
        tree[v]=max(tree[v*2],tree[v*2+1]);
    }

    void init(int _N)
    {
        N=_N;
        build(1,1,N);
    }

    void update(int pos, int d, int v, int l, int r)
    {
        if(l==r)
        {
            tree[v]=max(tree[v],d);
            return ;
        }

        int mid=(l+r)/2;
        if(pos<=mid) update(pos,d,v*2,l,mid);
        else update(pos,d,v*2+1,mid+1,r);
        tree[v]=max(tree[v*2],tree[v*2+1]);
    }

    void update(int pos, int d)
    {
        update(pos,d,1,1,N);
    }

    int query(int le, int ri, int v, int l, int r)
    {
        if(ri<l or r<le) return 0;
        if(le<=l and r<=ri) return tree[v];

        int mid=(l+r)/2;
        return max(query(le,ri,v*2,l,mid),query(le,ri,v*2+1,mid+1,r));
    }

    int query(int le, int ri)
    {
        return query(le,ri,1,1,N);
    }

}treeY,treeZ;

vector<pair<int,int>> bst;

void add(pair<int,int> pa)
{
    bst.push_back(pa);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y>>a[i].z;
    sort(a+1,a+n+1,cmpX);

    vector<pair<int,int>> temp;
    for(int i=1;i<=n;i++) temp.push_back({a[i].y,i});
    sort(temp.begin(),temp.end());
    int last=-1;
    for(pair<int,int> pa: temp)
    {
        if(pa.first!=last)
        {
            last=pa.first;
            nY++;
            realY[nY]=last;
        }
        a[pa.second].y=nY;
    }
    temp.clear();
    for(int i=1;i<=n;i++) temp.push_back({a[i].z,i});
    sort(temp.begin(),temp.end());
    last=-1;
    for(pair<int,int> pa: temp)
    {
        if(pa.first!=last)
        {
            last=pa.first;
            nZ++;
            realZ[nZ]=last;
        }
        a[pa.second].z=nZ;
    }

    treeY.init(nY);
    treeZ.init(nZ);
    int ptr=1,ans=-1;
    for(int i=1;i<=n;i++)
    {
        while(a[ptr].x<a[i].x)
        {
            if(a[ptr].y!=1) add({a[ptr].y,treeY.query(1,a[ptr].y-1)});
            if(a[ptr].z!=1) add({treeZ.query(1,a[ptr].z-1),a[ptr].z});
            treeY.update(a[ptr].y,a[ptr].z);
            treeZ.update(a[ptr].z,a[ptr].y);
            ptr++;
        }

        for(pair<int,int> pa: bst)
        {
            if(pa.first>a[i].y and pa.second>a[i].z) ans=max(ans,a[i].x+realY[pa.first]+realZ[pa.second]);
        }
    }

    cout<<ans<<"\n";

    return 0;
}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...