Cod sursa(job #2452431)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 30 august 2019 18:12:12
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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<=n; i+=(i&(-i)))
        for (int j=z; j<=n; j+=(j&(-j)))
            mat[i][j]=0;
}
int main()
{
    ifstream cin("cutii.in");
    ofstream cout("cutii.out");
    cin >> n >> t;
    for (int test=1; test<=t; ++test)
    {
        for (int i=1; i<=n; ++i)
            cin >>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]);
        }
        cout<< rez << '\n';
        for (int i=1; i<=n; ++i)
            reset(cutii[i].y,cutii[i].z);
    }
    return 0;
}