Cod sursa(job #3320337)

Utilizator yellowGreenFatu Mihai yellowGreen Data 5 noiembrie 2025 08:25:05
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <algorithm>

using namespace std;
ifstream cin("cutii.in");
ofstream cout("cutii.out");
int n;
int aib[3505][3505];
struct idx
{
    int x,y,z;
}T[3505];
bool cmp(idx a,idx b)
{
    return a.z<b.z || (a.z==b.z && a.y<b.y)
        ||(a.z==b.z && a.y==b.y && a.x<b.x);
}
void update(int x,int y,int v)
{
    for(int i=x;i<=n;i+=i&-i)
        for(int j=y;j<=n;j+=j&-j)
            aib[i][j]=max(aib[i][j],v);
}
int query(int x,int y)
{
    int ans=0;
    for(int i=x;i>=1;i-=i&-i)
        for(int j=y;j>=1;j-=j&-j)
            ans=max(ans,aib[i][j]);
    return ans;
}
void res(int x,int y)
{
    for(int i=x;i<=n;i+=i&-i)
        for(int j=y;j<=n;j+=j&-j)
            aib[i][j]=0;
}
int main()
{
    int test;
    cin>>n>>test;
    while(test--)
    {
        int ans=0;
        for(int i=1;i<=n;i++)
            cin>>T[i].x>>T[i].y>>T[i].z;
        sort(T+1,T+n+1,cmp);
        for(int i=1;i<=n;i++)
        {
            int x=T[i].x;
            int y=T[i].y;
            int cmax=1;
            cmax+=query(x-1,y-1);
            update(x,y,cmax);
            ans=max(ans,cmax);
        }
        cout<<ans<<"\n";
        for(int i=1;i<=n;i++)
            res(T[i].x,T[i].y);
    }
    return 0;
}