Pagini recente » Cod sursa (job #2647075) | Cod sursa (job #1944715) | Cod sursa (job #715757) | Cod sursa (job #1070733) | Cod sursa (job #476781)
Cod sursa(job #476781)
#include <stdio.h>
#include <algorithm>
#define Nmax 3502
using namespace std;
int C[Nmax][Nmax];
int X[Nmax],Y[Nmax],Z[Nmax],ind[Nmax];
int n,t;
inline int Maxim(int x,int y){ return x>y ? x:y; }
inline int cmp(int i,int j){
return Z[i] < Z[j];
}
inline int caut(int x,int y){
int zeroy,zerox,aux,rez=0;
zerox=0;
while( x >= 1 ){
aux=y; zeroy=0;
while( aux >= 1 ){
rez=Maxim(C[x][aux],rez);
while( ! ( aux & (1<<zeroy) ) ) ++zeroy;
aux -= (1<<zeroy);
}
while( ! ( x & (1<<zerox) ) ) ++zerox;
x -= (1<<zerox);
}
return rez;
}
inline void add(int x,int y){
int mx,zeroy,zerox,aux;
mx = caut(x-1,y-1);
zerox=0;
while( x <= n ){
aux=y; zeroy=0;
while( aux <= n ){
C[x][aux]=Maxim(C[x][aux],mx+1);
while( ! ( aux & (1<<zeroy) ) ) ++zeroy;
aux += (1<<zeroy);
}
while( ! ( x & (1<<zerox) ) ) ++zerox;
x += (1<<zerox);
}
}
inline void erase(int x,int y){
int zeroy,zerox,aux;
zerox=0;
while( x <= n ){
aux=y; zeroy=0;
while( aux <= n ){
C[x][aux]=0;
while( ! ( aux & (1<<zeroy) ) ) ++zeroy;
aux += (1<<zeroy);
}
while( ! ( x & (1<<zerox) ) ) ++zerox;
x += (1<<zerox);
}
}
int main(){
int i,rez;
freopen("cutii.in","r",stdin);
freopen("cutii.out","w",stdout);
scanf("%d%d",&n,&t);
for( ; t; --t){
for(i=1;i<=n;++i) scanf("%d%d%d",&X[i],&Y[i],&Z[i]),ind[i]=i;
sort(ind+1,ind+n+1,cmp);
for(i=1;i<=n;++i)
add(X[ind[i]],Y[ind[i]]);
rez=caut(n,n);
printf("%d\n",rez);
for(i=1;i<=n;++i) erase(X[ind[i]],Y[ind[i]]);
}
fclose(stdin); fclose(stdout);
return 0;
}