1
+ // LIS 3D problem
2
+
3
+ struct Segtree {
4
+ vi t;
5
+ int n;
6
+
7
+ Segtree (int n){
8
+ this ->n = n;
9
+ t.assign (2 *n, 0 );
10
+ }
11
+
12
+ int merge (int a, int b){
13
+ return max (a, b);
14
+ }
15
+
16
+ void build (){
17
+ for (int i=n-1 ;i>0 ;i--)
18
+ t[i] = merge (t[i<<1 ], t[i<<1 |1 ]);
19
+ }
20
+
21
+ int query (int l, int r){
22
+ int resl = -INF, resr = -INF;
23
+ for (l+=n, r+=n+1 ; l<r; l>>=1 , r>>=1 ){
24
+ if (l&1 ) resl = merge (resl, t[l++]);
25
+ if (r&1 ) resr = merge (t[--r], resr);
26
+ }
27
+ return merge (resl, resr);
28
+ }
29
+
30
+ void update (int p, int value){
31
+ p+=n;
32
+ for (t[p]=max (t[p], value); p >>= 1 ;)
33
+ t[p] = merge (t[p<<1 ], t[p<<1 |1 ]);
34
+ }
35
+ };
36
+
37
+ struct point {
38
+ int x, y, z, id;
39
+ bool left;
40
+ point (int x=0 , int y=0 , int z=0 ): x(x), y(y), z(z){
41
+ left = false ;
42
+ }
43
+ bool operator <(point &o){
44
+ if (x != o.x ) return x < o.x ;
45
+ if (y != o.y ) return y > o.y ;
46
+ return z < o.z ;
47
+ }
48
+ };
49
+
50
+
51
+ void cdq (int l, int r, vector<point> &a, vi &dp){
52
+ if (l==r) return ;
53
+
54
+ int mid = (l+r) / 2 ;
55
+
56
+ cdq (l, mid, a, dp);
57
+
58
+ // compress z
59
+ set<int > uz; map<int , int > idz;
60
+ for (int i=l;i<=r;i++) uz.insert (a[i].z );
61
+ int id = 0 ;
62
+ for (auto z: uz) idz[z] = id++;
63
+
64
+ vector<point> tmp;
65
+ for (int i=l;i<=r;i++){
66
+ tmp.pb (a[i]);
67
+ tmp.back ().x = 0 ;
68
+ tmp.back ().z = idz[tmp.back ().z ];
69
+ if (i<=mid)
70
+ tmp.back ().left = true ;
71
+ }
72
+
73
+ Segtree st (id);
74
+
75
+ sort (tmp.rbegin (), tmp.rend ());
76
+
77
+ for (auto t: tmp){
78
+ if (t.left ){
79
+ st.update (t.z , dp[t.id ]);
80
+ }else {
81
+ dp[t.id ] = max (dp[t.id ], st.query (0 , t.z -1 )+1 );
82
+ }
83
+ }
84
+
85
+ cdq (mid+1 , r, a, dp);
86
+ }
87
+
88
+
89
+ int32_t main ()
90
+ {sws;
91
+
92
+ int n; cin >> n;
93
+
94
+ vector<point> vet (n);
95
+ for (int i=0 ;i<n;i++){
96
+ cin >> vet[i].x >> vet[i].y >> vet[i].z ;
97
+ }
98
+
99
+ sort (vet.begin (), vet.end ());
100
+
101
+ for (int i=0 ;i<n;i++)
102
+ vet[i].id = i;
103
+
104
+ vi dp (n, 1 );
105
+
106
+ cdq (0 , n-1 , vet, dp);
107
+
108
+ int ans = 0 ;
109
+ for (int i=0 ;i<n;i++)
110
+ ans = max (ans, dp[i]);
111
+
112
+ cout << ans << endl;
113
+
114
+
115
+ return 0 ;
116
+ }
0 commit comments