Pagini recente » Istoria paginii runda/oji_bv_1112/clasament | Cod sursa (job #2154550) | Cod sursa (job #2960581) | Cod sursa (job #2801250) | Cod sursa (job #2926168)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "cutii.in" );
ofstream fout( "cutii.out" );
const int DIM = 3505;
struct qq {
int a, b, c;
} v[DIM];
int aib[DIM][DIM], n;
void update( int x, int y, int val ) {
for ( int i = x; i <= n; i += (i & -i) ) {
for ( int j = y; j <= n; j += (j & -j) ) {
aib[i][j] = max(aib[i][j], val);
}
}
}
void undo( int x, int y ) {
for ( int i = x; i <= n; i += (i & -i) ) {
for ( int j = y; j <= n; j += (j & -j) ) {
aib[i][j] = 0;
}
}
}
int query( int x, int y ) {
int res = 0;
for ( int i = x; i > 0; i -= (i & -i) ) {
for ( int j = y; j > 0; j -= (j & -j) ) {
res = max(aib[i][j], res);
}
}
return res;
}
int main() {
int t;
fin >> n >> t;
while ( t-- ) {
for ( int i = 0; i < n; ++i ) {
fin >> v[i].a >> v[i].b >> v[i].c;
}
sort( v, v + n, []( const qq &x, const qq &y ) { return x.a < y.a; } );
for ( int i = 0; i < n; ++i ) {
int val = query( v[i].b, v[i].c );
update( v[i].b, v[i].c, val + 1 );
}
fout << query( n, n ) << "\n";
for ( int i = 0; i < n; ++i ) {
undo( v[i].b, v[i].c );
}
}
fin.close();
fout.close();
return 0;
}