Pagini recente » Monitorul de evaluare | Diferente pentru home intre reviziile 79 si 78 | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #2013502)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int T, n; //exceptional
struct cutie{
int x;
int y;
int z;
};
bool criteriu (const cutie a, const cutie b)
{
if(a.x==b.x)
{
if(a.y==b.y)
return a.z < b.z;
return a.y < b.y;
}
else return a.x < b.x;
}
int aib[3502][3502];
int query(int x, int y)
{
int maxim = 0;
for(int i=x;i>0;i-=i&-i)
for(int j=y;j>0;j-=j&-j)
if(aib[i][j]>maxim)
maxim=aib[i][j];
return maxim;
}
void update(int x, int y, int val)
{
for(int i=x;i<=n;i+=i&-i)
for(int j=y;j<=n;j+=j&-j)
if(val>aib[x][y])
aib[x][y]=val;
}
vector <cutie> cutii (3505);
int main()
{
ifstream in ("cutii.in");
ofstream out ("cutii.out");
int ans=0, val;
in>>n>>T;
cutie temp, nul;
nul.x=0;
nul.y=0;
nul.z=0;
cutii[n]=nul;
for(;T>0;--T)
{
for(int i=0;i<n;++i)
{
in>>temp.x>>temp.y>>temp.z;
cutii[i]=temp;
}
sort(cutii.begin(), cutii.begin()+n, criteriu);
//for(int i=0;i<n;++i)
// cout<<"("<<cutii[i].x<<","<<cutii[i].y<<","<<cutii[i].z<<") ";
//cout<<endl;
for(int i=0;i<n;++i)
{
val=query(cutii[i].y-1, cutii[i].z-1);
++val;
//cout<<val<<" ";
if(val>ans)
ans=val;
if(cutii[i].x!=cutii[i+1].x)
for(int j=i;cutii[j].x==cutii[i].x;--j)
{
update(cutii[j].y, cutii[j].z, ans);
// cout<<"updating.. ("<<ans<<") ";
}
}
//clear aib
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
aib[i][j]=0;
out<<ans<<"\n";
ans=0;
}
return 0;
}