Cod sursa(job #2953677)

Utilizator Chris_BlackBlaga Cristian Chris_Black Data 11 decembrie 2022 22:46:07
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream cin("cutii.in");
ofstream cout("cutii.out");
const int N = 3509;
struct cuti
{
    int x,y,z;
    bool operator < (cuti b)
    {
        return (x<b.x&&y<b.y&&z<b.z);
    }
    bool operator > (cuti b)
    {
        return (x>b.x&&y>b.y&&z>b.z);
    }
    bool operator == (cuti b)
    {
        return (x<b.x&&y<b.y&&z<b.z)&&(x>b.x&&y>b.y&&z>b.z);
    }
    bool operator <= (cuti b)
    {
        return (x<b.x&&y<b.y&&z<b.z) || ((x<b.x&&y<b.y&&z<b.z)&&(x>b.x&&y>b.y&&z>b.z));
    }
    bool operator >= (cuti b)
    {
        return (x>b.x&&y>b.y&&z>b.z)||((x<b.x&&y<b.y&&z<b.z)&&(x>b.x&&y>b.y&&z>b.z));
    }
};

int n,t;
vector<int> aib,L,p;
vector<cuti> a,b;

int Query(int x)
{
    int maxi = 0;
    for(int i = x; i; i -= i&-i)
        maxi = max(aib[i],maxi);
    return maxi;
}

void Update(int poz,int val)
{
    for(int i = poz; i<= n ; i+=i&-i)
        aib[i] = max(aib[i],val);
}

int main()
{
    cin>>n>>t;
    while(t--)
    {
        int ans = 1;
        aib = L = p = vector<int>(n+4);
        a = b = vector<cuti> (n);
        for(int i=0;i<n;++i)
            cin>>a[i].x>>a[i].y>>a[i].z;
        b = a;
        sort(b.begin(),b.end());
        for(int i=0;i<n;++i)
            p[i] = lower_bound(b.begin(),b.end(),a[i]) - b.begin() +1;
        for(int i=0;i<n;++i)
        {
            L[i] = Query(p[i]-1) +1;
            ans = max(ans,L[i]);
            Update(p[i],L[i]);
        }
        cout<<ans<<'\n';
    }
    return 0;
}