Cod sursa(job #992863)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 2 septembrie 2013 17:44:10
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct R
{
    int x,y,z;
}r[3501];
int n,l,i,b1[3501],l1[3501],l2[3501],b2[3501],p1[3501],p2[3501],x,r1,r2,c1[3501],c2[3501],u1,u2,m,p,j,t,m1,m2;

inline bool A(R a,R b)
{
    return a.x<b.x;
}

 
inline int C(int v[],int x,int r,int l[])
{
   int p=0,u=r,m;
   m=(p+u)/2;
   while(p<=u)
   if(v[l[m]]<x&&v[l[m+1]]>=x) 
        return m;
   else 
        if(v[l[m+1]]<x) 
             p=m+1,m=(p+u)/2;
        else 
             u=m-1,m=(p+u)/2;
   return r;
}

int main()
{
    freopen("cutii.in","r",stdin),
    freopen("cutii.out","w",stdout),
    scanf("%d%d",&n,&t);
    while(t--)
    {
          for(i=1;i<=n;i++)
                scanf("%d%d%d",&r[i].x,&r[i].y,&r[i].z);
          sort(r+1,r+n+1,A);
          for(i=1;i<=n;i++)
                b1[i]=r[i].y,b2[i]=r[i].z;
          r1=r2=c1[1]=c2[1]=l2[1]=l1[1]=1,l2[0]=l1[0]=0;
          for(i=2;i<=n;i++)
          {
                u1=C(b1,b1[i],r1,l1),p1[i]=l1[u1],c1[i]=u1+1,l1[u1+1]=i;
                if(r1<u1+1)
                      r1=u1+1;
          }
          for(m1=0,i=1;i<=n;i++)
          if(c1[i]>m1)
                m1=c1[i];
          for(i=2;i<=n;i++)
          {
                u2=C(b2,b2[i],r2,l2),p2[i]=l2[u2],c2[i]=u2+1,l2[u2+1]=i;
                if(r2<u2+1)
                      r2=u2+1;
          }
          for(m2=0,i=1;i<=n;i++)
          if(c2[i]>m2)
                m2=c2[i];
          if(m1<m2)
                for(i=1;i<=n;i++)
                     x=c1[i],c1[i]=c2[i],c2[i]=x;
          m=min(m1,m2);
          for(l=0,j=2,i=1;i<=n&&j<=m;i++)
          if(c2[i]+1==c1[i]&&c1[i]==j)
                j++,l++;
          printf("%d\n",l?l:m);
    }
}