Cod sursa(job #1996762)

Utilizator SchnitzelMannPavaloiu Gabriel SchnitzelMann Data 2 iulie 2017 15:57:55
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("cutii.in");
ofstream out("cutii.out");
short dim[3500][3];
short XD[3500];
short mx[3500];
void merge(int l,int r,int m)
{
    short n1=m-l+1,n2=r-m,i,j=0,k=l;
    short L[n1][3],R[n2][3];
    for(i=0;i<n1;i++)
    {
        L[i][0]=dim[l+i][0];
        L[i][1]=dim[l+i][1];
        L[i][2]=dim[l+i][2];
    }
    for(i=0;i<n2;i++)
    {
        R[i][0]=dim[m+i+1][0];
        R[i][1]=dim[m+i+1][1];
        R[i][2]=dim[m+i+1][2];
    }
    i=0;
    while(i<n1&&j<n2)
    {
        if(L[i][0]<R[j][0])
        {
            dim[k][0]=L[i][0];
            dim[k][1]=L[i][1];
            dim[k][2]=L[i][2];
            i++;
        }
        else
        {
            dim[k][0]=R[j][0];
            dim[k][1]=R[j][1];
            dim[k][2]=R[j][2];
            j++;
        }
        k++;
    }
    while(i<n1)
    {
        dim[k][0]=L[i][0];
        dim[k][1]=L[i][1];
        dim[k][2]=L[i][2];
        i++;
        k++;
    }
    while(j<n2)
    {
        dim[k][0]=R[j][0];
        dim[k][1]=R[j][1];
        dim[k][2]=R[j][2];
        j++;
        k++;
    }
}
void mergesort(int l,int r)
{
    if(r>l)
    {
        int m=(l+r)/2;
        mergesort(l,m);
        mergesort(m+1,r);
        merge(l,r,m);
    }
}

int main()
{
    short n,t,i,j,ii,m,s;
    in>>n>>t;
    for(ii=0;ii<t;ii++)
    {
        for(i=0;i<n;i++)
        {
            in>>dim[i][0]>>dim[i][1]>>dim[i][2];
        }
        mergesort(0,n-1);
        m=0;
        for(j=0;j<n;j++)
        {
            s=0;
            while(i>=0&&dim[i][0]==dim[j][0])i--;
            for(i=j-1;i>=0;i--)
                if(XD[i]>s&&dim[i][1]<dim[j][1]&&dim[i][2]<dim[j][2])
                {
                    s=XD[i];
                    if(XD[i]==mx[i])
                        i=0;
                }
            XD[j]=s+1;
            if(XD[j]>m)
            {
                m=XD[j];
                mx[j]=m;
            }
            else
                mx[j]=mx[j-1];
        }
        out<<m<<"\n";
    }
    return 0;
}