Cod sursa(job #2518898)

Utilizator vlad082002Ciocoiu Vlad vlad082002 Data 6 ianuarie 2020 18:26:04
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

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

struct cutie {
    int x, y, z;
    bool operator<(const cutie &other) const {
        return x < other.x && y < other.y && z < other.z;
    }
} v[3510];

int n, t, res;
int dp[3510], aib[3510][3510];

bool cmp(cutie a, cutie b) {
    if (a.x > b.x) return 0;
    else if(a.x == b.x) {
        if(a.y > b.y) return 0;
        if(a.y == b.y) {
            if(a.z > b.z) return 0;
            else return 1;
        }
        else return 1;
    }
    else return 1;
}

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

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

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

void solve() {
    while(t--) {
        for(int i = 1; i <= n; i++)
            fin >> v[i].x >> v[i].y >> v[i].z;

        sort(v+1, v+n+1, cmp);
        for(int i = 1; i <= n; i++) {
            int q = query(v[i].y-1, v[i].z-1) + 1;
            update(v[i].y, v[i].z, q);
        }
        fout << query(n, n) << '\n';

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

int main() {
    fin >> n >> t;
    solve();
}