Cod sursa(job #2348151)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 19 februarie 2019 13:50:39
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <bits/stdc++.h>

struct box {
    box (int x = 0, int y = 0, int z = 0) : x(x), y(y), z(z) {}
    int x, y, z;
    bool operator < (const box& other) const {
        return z < other.z;
    }
};  std::istream& operator >> (std::istream& stream, box& data) {
    return stream >> data.x >> data.y >> data.z;
}

#define MAXN 3505

int N;
box Box[MAXN];

#define Zeros(X) X&(-X)

int Fenwick[MAXN][MAXN];

void Reset(int X, int Y, int Value = 0) {
    for (int i=X, j; i<=N; i += Zeros(i))
        for (j=Y; j<=N; j += Zeros(j))
            Fenwick[i][j] = Value;
}

void Update(int X, int Y, int Value) {
    for (int i=X, j; i<=N; i += Zeros(i))
        for (j=Y; j<=N; j += Zeros(j))
            Fenwick[i][j] = std::max(Fenwick[i][j], Value);
}

int Query(int X, int Y) {
    int Ans = 0;
    for (int i=X, j; i>=1; i -= Zeros(i))
        for (j=Y; j>=1; j -= Zeros(j))
            Ans = std::max(Ans, Fenwick[i][j]);
    return Ans;
}

std::ifstream In ("cutii.in");
std::ofstream Out("cutii.out");

void Citire() {
    for (int i=1; i<=N; ++i)
        In >> Box[i];
}

void Rezolvare() {
    std::sort (Box+1, Box+N+1);

    int Ans = 0;
    for (int i=1, Dyn; i<=N; ++i) {
        Dyn = Query(Box[i].x, Box[i].y) + 1;
        Update(Box[i].x, Box[i].y, Dyn);

        Ans = std::max(Ans, Dyn);
    }   Out << Ans << '\n';
}

void Reset() {
    for (int i=1; i<=N; ++i)
        Reset(Box[i].x, Box[i].y);
}

int main()
{
    int T;
    In >> N >> T;
    while (T--) {
        Citire();
        Rezolvare();
        Reset();
    }

    return 0;
}