Cod sursa(job #2809840)

Utilizator rares89_Dumitriu Rares rares89_ Data 27 noiembrie 2021 18:49:44
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>

using namespace std;

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

pair<int, int> v[3505];
int aib[3505][3505], n;

int query(int ii, int jj) {
    int ans = 0;
    for(int i = ii; i > 0; i -= (i & -i)) {
        for(int j = jj; j > 0; j -= (j & -j)) {
            ans = max(ans, aib[i][j]);
        }
    }
    return ans;
}

void update(int ii, int jj, int val) {
    for(int i = ii; i <= n; i += (i & -i)) {
        for(int j = jj; j <= n; j += (j & -j)) {
            aib[i][j] = max(aib[i][j], val);
        }
    }
}

void clear(int ii, int jj) {
    for(int i = ii; i <= n; i += (i & -i)) {
        for(int j = jj; j <= n; j += (j & -j)) {
            aib[i][j] = 0;
        }
    }
}

int main() {
    int t;
    fin >> n >> t;
    while(t > 0) {
        for(int i = 1; i <= n; i++) {
            int x, y, z;
            fin >> x >> y >> z;
            v[z] = {x, y};
        }
        for(int i = 1; i <= n; i++) {
            int val = query(v[i].first, v[i].second);
            update(v[i].first, v[i].second, val + 1);
        }
        fout << query(n, n) << "\n";
        for(int i = 1; i <= n; i++) {
            clear(v[i].first, v[i].second);
        }
        t--;
    }
    return 0;
}