Cod sursa(job #3183419)

Utilizator davidenko22Stancu David-Andrei davidenko22 Data 11 decembrie 2023 19:58:47
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <bits/stdc++.h>

const int NMAX = 3500;

using namespace std;

ifstream fin("cutii.in");
ofstream fout("cutii.out");

int n, t;

struct paralelipiped {
    int x, y, z;
};

vector<paralelipiped> v;

short aib2d[NMAX + 1][NMAX + 1], ans;

bool cmp(paralelipiped A, paralelipiped B) {
    return(A.z < B.z);
}
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)) ) {
        aib2d[i][j] = (val > aib2d[i][j] ? val : aib2d[i][j]);
      }
    }
}
short query(int x, int y) {
    short ans = 0;
    for ( int i = x; i > 0; i -= (i & (-i)) ) {
      for ( int j = y; j > 0; j -= (j & (-j)) ) {
        if ( aib2d[i][j] > ans )
          ans = aib2d[i][j];
        }
    }
    return ans;
}
void clean(int x, int y) {
    for ( int i = x; i <= n; i += (i & (-i)) ) {
      for ( int j = y; j <= n; j += (j & (-j)) ) {
        aib2d[i][j] = 0;
      }
    }
}
int main() {
    fin >> n >> t;
    for ( ; t; t-- ) {
      for ( int i = 1; i <= n; i++ ) {
        int x, y, z;
        fin >> x >> y >> z;
        v.push_back({x, y, z});
      }
      sort(v.begin(), v.end(), cmp);
      for ( auto a : v ) {
        int dp = 1 + query(a.x, a.y);
        if ( dp > ans )
          ans = dp;
        update(a.x, a.y, dp);
      }
      fout << ans << "\n";
      ans = 0;
      for ( auto a : v ) {
        clean(a.x, a.y);
      }
      v.clear();
    }
    return 0;
}