Cod sursa(job #3265814)

Utilizator andreea678Rusu Andreea-Cristina andreea678 Data 3 ianuarie 2025 16:01:57
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
#define MAXN 3505
using namespace std;

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

int n, t;
int aib[MAXN + 5][MAXN + 5];

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

cutie v[MAXN];


bool compare(cutie a, cutie b) {
    if (a.x == b.x) {
        if (a.y == b.y) {
            return a.z < b.z;
        } else {
            return a.y < b.y;
        }
    } else {
        return a.x < b.x;
    }
}


void update(int p1, int p2, int val) {
    for (int i = p1; i <= MAXN; i += i & (-i)) {
        for (int j = p2; j <= MAXN; j += j & (-j)) {
            aib[i][j] = max(aib[i][j], val);
        }
    }
}


void reset(int p1, int p2) {
    for (int i = p1; i <= MAXN; i += i & (-i)) {
        for (int j = p2; j <= MAXN; j += j & (-j)) {
            aib[i][j] = 0;
        }
    }
}


int query(int p1, int p2) {
    int maxi = 0;
    for (int i = p1; i > 0; i -= i & (-i)) {
        for (int j = p2; j > 0; j -= j & (-j)) {
            maxi = max(maxi, aib[i][j]);
        }
    }
    return maxi;
}

int main() {
    fin >> n >> t;
    for (int test = 1; test <= t; ++test) {
        for (int i = 1; i <= n; ++i) {
            fin >> v[i].x >> v[i].y >> v[i].z;
        }


        sort(v + 1, v + n + 1, compare);

        for (int i = 1; i <= n; ++i) {

            int q = query(v[i].y - 1, v[i].z - 1);

            update(v[i].y, v[i].z, q + 1);
        }


        fout << query(MAXN, MAXN) << '\n';


        for (int i = 1; i <= n; ++i) {
            reset(v[i].y, v[i].z);
        }
    }
    return 0;
}