http://acm.pku.edu.cn/JudgeOnline/problem?id=1065

Код:
#define maxn 5003
#include<string.h>
#include<stdio.h>
long int  k,l[maxn],w[maxn],h[maxn];
void make1(long int s,long int t)
  {int i,j,x,t1;
   i=s;j=t;x=i;
   do 
    {while ((i<j)&&(l[j]>=l[x])) j-=1; 
       t1=l[j];l[j]=l[x];l[x]=t1;
       t1=w[j];w[j]=w[x];w[x]=t1;
       x=j;
     while ((i<j)&&(l[i]<=l[x])) i+=1;
       t1=l[i];l[i]=l[x];l[x]=t1;
       t1=w[i];w[i]=w[x];w[x]=t1;
       x=i;}
  while (i<j);
  k=x;
  }
void make2(long int s,long int t)
 {
   if (s<t)
      { make1(s,t);
        make2(s,k-1);
        make2(k+1,t);
      }
 }
int main()
{long int max,sec,i,j,q,k,m,n;
 scanf("%ld",&m);
 for (q=1;q<=m;q++) 
  { memset(l,0,sizeof(l));
    memset(w,0,sizeof(w));  
    scanf("%ld",&n);
    for (i=1;i<=n;i++){scanf("%ld",&l[i]);scanf("%ld",&w[i]);}  
    k=0;make2(1,n);
    for (i=1;i<=n-1;i++)
	 for(j=i+1;j<=n;j++)
	 {if ((l[i]==l[j])&&(w[i]>w[j]))
	 {max=w[i];w[i]=w[j];w[j]=max;}
	 if (l[j]>l[i]) break;
	 }
	memset(h,0,sizeof(h));k=1;h[1]=w[1];
    for (i=2;i<=n;++i)
     {max=-1;
      for (j=1;j<=k;++j)
	  if (w[i]>=h[j]&&max<h[j]) {max=h[j];sec=j;}
       if (max==-1) h[++k]=w[i];
	      else h[sec]=w[i];
     }            
    printf("%ld\n",k);
  }
}