Cod sursa(job #2360508)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 1 martie 2019 21:24:23
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("cutii.in");
ofstream out("cutii.out");
const int N = 3505;
int fn[N][N],dp[N],n;
struct box
{
    int x,y,z;
} v[N];
bool comp(box a, box b)
{
    return a.x<b.x;
}
int query(int y, int z)
{
    int Max = 0;
    for (int i = y; i>0; i-=i&(-i))
        for (int j = z; j>0; j-=j&(-j))
            Max = max(Max,fn[i][j]);
    return Max;
}
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))
            fn[i][j] = max(fn[i][j],val);
}
void reset(int y, int z)
{
    for (int i = y; i<=n; i+=i&(-i))
        for (int j = z; j<=n; j+=j&(-j))
            fn[i][j] = 0;
}

int main()
{
    int t;
    in >> n >> t;
    while (t--)
    {
        for (int i = 1; i<=n; i++)
            in >> v[i].x >> v[i].y >> v[i].z;
        sort(v+1,v+n+1,comp);
        int ans = 0;
        for (int i = 1; i<=n; i++)
        {
            dp[i] = query(v[i].y,v[i].z)+1;
            update(v[i].y,v[i].z,dp[i]);
            ans = max(ans,dp[i]);
        }
        out << ans << "\n";
        for (int i = 1; i<=n; i++)
            reset(v[i].y,v[i].z);
    }
}