Cod sursa(job #1434851)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 11 mai 2015 16:00:59
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<cstdio>
#include<algorithm>
#define x first
#define y second
using namespace std;
pair<int,pair<int,int> > p[3501];
int b[3501],c[3501],d[3501],e[3501],x[3501],y[3501],i,n,t,m,k,u,r,l,q,g,h,v;
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",&p[i].x,&p[i].y.x,&p[i].y.y);
		sort(p,p+n);
		for(i=1;i<=n;i++)
			x[i]=p[i].y.x,y[i]=p[i].y.y;
		u=v=b[1]=c[1]=d[1]=e[1]=1,c[0]=e[0]=0;
		for(i=2;i<=n;i++) {
			l=0,r=u,m=(l+r)/2,k=-1;
			while(l<=r&&k==-1)
				if(x[c[m]]<x[i]&&x[c[m+1]]>x[i])
					k=m;
				else
					if(x[c[m+1]]<x[i])
						l=m+1,m=(l+r)/2;
					else
						r=m-1,m=(l+r)/2;
			k=(k==-1?u:k),b[i]=k+1,c[k+1]=i,u=(u<k+1?(k+1):u);
			l=0,r=v,m=(l+r)/2,k=-1;
			while(l<=r&&k==-1)
				if(y[e[m]]<y[i]&&y[e[m+1]]>y[i])
					k=m;
				else
					if(y[e[m+1]]<y[i])
						l=m+1,m=(l+r)/2;
					else
						r=m-1,m=(l+r)/2;
			k=(k==-1?v:k),d[i]=k+1,e[k+1]=i,v=(v<k+1?(k+1):v);
		}
		for(q=m=1,l=n,i=n-1;i;i--)
		if(b[i]<b[l]&&d[i]<d[l])
			m++,l=i;
		else
			if(b[i]>b[l]&&d[i]>d[l])
				q=q<m?m:q,m=1,l=i;	
		printf("%d\n",q<m?m:q);
   	}
}