Cod sursa(job #491346)

Utilizator hadesgamesTache Alexandru hadesgames Data 10 octombrie 2010 23:20:40
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define mp make_pair
FILE *in,*out;
typedef pair<int,int> ii;
ii arb[3505][3505];
pair<int,pair<int,int> > a[3550];
int n;
inline ii maxv (ii x,ii y,int t)
{
	if (x.se!=t&&y.se==t)
		return y;
	if (x.se==t&&y.se!=t)
		return x;
	return x.fi>y.fi?x:y;
}
inline int bit(int x)
{
	return (x&(x-1))^x;
}
int query(int x,int y,int t)
{
	int i,j;
	ii rez=mp(0,t);
	for (i=x;i>0;i-=bit(i))
		for (j=y;j>0;j-=bit(j))
			rez=maxv(rez,arb[i][j],t);
	return rez.fi;
}
void update(int x,int y,int val,int t)
{
	int i,j;
	ii aux=mp(val,t);
	for (i=x;i<=n;i+=bit(i))
		for (j=y;j<=n;j+=bit(j))
			arb[i][j]=maxv(arb[i][j],aux,t);
}
int main()
{
	int T,t,i,val;
	in=fopen("cutii.in","r");
	out=fopen("cutii.out","w");
	fscanf(in,"%d%d",&n,&T);
	for (t=1;t<=T;t++)
	{
		for (i=1;i<=n;i++)
			fscanf(in,"%d%d%d",&a[i].fi,&a[i].se.fi,&a[i].se.se);
		sort(a+1,a+n+1);
		for (i=1;i<=n;i++)
		{
			val=1+query(a[i].se.fi,a[i].se.se,t);
			update(a[i].se.fi,a[i].se.se,val,t);
		}
		fprintf(out,"%d\n",query(n,n,t));
	}
	fclose(in);
	fclose(out);
	return 0;

}