Cod sursa(job #1782166)

Utilizator cristian.caldareaCaldarea Cristian Daniel cristian.caldarea Data 17 octombrie 2016 20:48:31
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

const int Nmax = 3500;

struct Cutie {
    int x, y, z;

    Cutie(int _x = 0, int _y = 0, int _z = 0) : x(_x), y(_y), z(_z)
    {
    }
    bool operator < (const Cutie &a) const
    {
        return z < a.z;
    }
};

int n, t;
int aib[Nmax + 10][Nmax + 10];

void Update(int cx, int cy, int val);
int Query(int cx, int cy);
void Set(int cx, int cy);
int Solve(int n);

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

    for(int i = 1; i <= t; i++)
        fout << Solve(n) << '\n';
    fin.close();
    fout.close();
    return 0;
}

void Update(int x, int y, int val)
{
     for (int i = x; i <= Nmax; i += i & -i)
        for (int j = y; j <= Nmax; j += j & -j)
            aib[i][j] = max(aib[i][j], val);
}


int Query(int x, int y)
{
    int ans = 0;
    for (int i = x; i > 0; i -= i & -i)
        for (int j = y; j > 0; j -= j & -j)
            ans = max(ans, aib[i][j]);
    return ans;
}

void Set(int x, int y)
{
     for (int i = x; i <= Nmax; i += i & -i)
        for (int j = y; j <= Nmax; j += j & -j)
            aib[i][j] = 0;
}

int Solve(int n)
{

    int x, y, z, ans = 0, d;

    vector<Cutie> C;

    for (int i = 1; i <= n; i++)
    {
        fin >> x >> y >> z;
        C.push_back(Cutie(x, y, z));
    }

    sort(C.begin(), C.end());


    for (const auto& c : C)
    {
        d = Query(c.x - 1, c.y - 1) + 1;
        Update(c.x, c.y, d);
        ans = max(ans, d);
    }

    for (const auto& c : C)
        Set(c.x, c.y);

    return ans;
}