Cod sursa(job #3149499)

Utilizator CelestinNegraru Celestin Celestin Data 9 septembrie 2023 13:06:28
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define nmax 3502
using namespace std;
int n,t;
struct paralelipiped{
    int x,y,z;
};
vector<paralelipiped> v;
short aib2d[nmax][nmax],ans;
ifstream f("cutii.in");
ofstream g("cutii.out");
bool cmp(paralelipiped A,paralelipiped B)
{
    return(A.z<B.z);
}
void update(int x,int y,int val)
{
    for(int i=x;i<=n;i+=(i&(-i)))
    {
        for(int j=y;j<=n;j+=(j&(-j)))
        {
            aib2d[i][j]=(val>aib2d[i][j]?val:aib2d[i][j]);
        }
    }
}
short query(int x,int y)
{
    short ans=0;
    for(int i=x;i>0;i-=(i&(-i)))
    {
        for(int j=y;j>0;j-=(j&(-j)))
        {
            if(aib2d[i][j]>ans)
                ans=aib2d[i][j];
        }
    }
    return ans;
}
void clean(int x,int y)
{
    for(int i=x;i<=n;i+=(i&(-i)))
    {
        for(int j=y;j<=n;j+=(j&(-j)))
        {
            aib2d[i][j]=0;
        }
    }
}
int main()
{
    f>>n>>t;
    for(;t;--t)
    {
        for(int i=1;i<=n;i++)
        {
            int x,y,z;
            f>>x>>y>>z;
            v.push_back({x,y,z});
        }
        sort(v.begin(),v.end(),cmp);
        for(auto a:v)
        {
           int dp=1+query(a.x,a.y);
           if(dp>ans)
               ans=dp;
           update(a.x,a.y,dp);
        }
        g<<ans<<"\n";
        ans=0;
        for(auto a:v)
        {
            clean(a.x,a.y);
        }
        v.clear();
    }
    return 0;
}