Cod sursa(job #805448)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 31 octombrie 2012 15:02:00
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<fstream>
#include<algorithm>
using namespace std;

struct cutie
{
	int x,y,z;
};

struct st
{
	int x,y;
};

cutie a[3501];
st v[3501][3501];
int i,k,t,n,mx,s,j;

bool cmp(cutie a,cutie b)
{
	return a.z<b.z;
}

int query(int x,int y)
{
	int i,j,s=0;
	for (i=x;i>0;i=i & (i-1))
		for (j=y;j>0;j=j & (j-1))
			if (v[i][j].y==k)
				s=max(s,v[i][j].x);
	return s;
}

void update(int x,int y,int z)
{
	int i,j;
	for (i=x;i<=n;i=(i | (i-1))+1)
		for (j=y;j<=n;j=(j | (j-1))+1)
		{
			if (v[i][j].y==k)
				v[i][j].x=max(v[i][j].x,z);
			else
			{		
				v[i][j].x=z;
				v[i][j].y=k;
			}
		}
}

int main()
{
	ifstream f("cutii.in");
	ofstream g("cutii.out");
	f >> n >> t;
	for (k=1;k<=t;k++)
	{
		mx=0;
		for (i=1;i<=n;i++)
			f >> a[i].x >> a[i].y >> a[i].z;
		sort(a+1,a+n+1,cmp);
		for (i=1;i<=n;i++)
		{
			s=query(a[i].x,a[i].y);
			mx=max(s,mx);
			update(a[i].x,a[i].y,s+1);
		}
		g << mx+1 << "\n";
	}
	return 0;
}