Cod sursa(job #2412565)

Utilizator victorv88Veltan Victor victorv88 Data 22 aprilie 2019 13:20:26
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream f("cutii.in");
ofstream g("cutii.out");

struct cut{
    int x, y, z;
}cutii[3505];

int n, t, dp[3505], mat[3505][3505], rez;

bool operator<(cut a, cut b)
{
    return a.x<b.x;
}

int query(int y, int z)
{
    int ans=0;
    for (int i=y; i>0; i-=(i&(-i)))
    {
        for (int j=z; j>0; j-=(j&(-j)))
        {
            ans=max(ans,mat[i][j]);
        }
    }
    return ans;
}

void update(int y, int z, int val)
{
    for (int i=y; i<=n; i+=(i&(-i)))
    {
        for (int j=z; j<=n; j+=(j&(-j)))
        {
            mat[i][j]=max(mat[i][j],val);
        }
    }
}

void reset(int y, int z)
{
    for (int i=y; i>0; i-=(i&(-i)))
    {
        for (int j=z; j>0; j-=(j&(-j)))
        {
            mat[i][j]=0;
        }
    }
}

int main() {
    f >> n >> t;
    for (int test=1; test<=t; ++test)
    {
        for (int i=1; i<=n; ++i)
        {
            f >> cutii[i].x >> cutii[i].y >> cutii[i].z;
        }
        rez=0;
        sort(cutii+1,cutii+n+1);
        for (int i=1; i<=n; ++i)
        {
            dp[i]=query(cutii[i].y, cutii[i].z)+1;
            update(cutii[i].y,cutii[i].z,dp[i]);
            rez=max(rez,dp[i]);
        }
        g << rez << '\n';
        for (int i=1; i<=n; ++i)
            reset(cutii[i].y,cutii[i].z);
    }
    return 0;
}