Pagini recente » Cod sursa (job #482105) | Cod sursa (job #1605246) | Cod sursa (job #929189) | Cod sursa (job #642694) | Cod sursa (job #1336371)
#include <stdio.h>
#define MAXN 3500
int aib[MAXN+1][MAXN+1], x[MAXN], y[MAXN], z[MAXN], n;
inline int tata(int p){
return (p-1)>>1;
}
inline int fiust(int p){
return (p<<1)+1;
}
inline int fiudr(int p){
return (p<<1)+2;
}
inline void swap(int a, int b){
int aux=x[a]; x[a]=x[b]; x[b]=aux;
aux=y[a]; y[a]=y[b]; y[b]=aux;
aux=z[a]; z[a]=z[b]; z[b]=aux;
}
inline void coborare(int p){
int f=1, q;
while((f==1)&&(fiust(p)<n)){
q=fiust(p);
if((fiudr(p)<n)&&(x[fiudr(p)]>x[q])){
q=fiudr(p);
}
if(x[q]>x[p]){
swap(p, q);
p=q;
}else{
f=0;
}
}
}
inline void heapify(){
int i;
for(i=tata(n-1); i>=0; i--){
coborare(i);
}
}
inline void heapSort(){
int cn=n;
while(n>1){
n--;
swap(0, n);
coborare(0);
}
n=cn;
}
inline int ub(int p){
return p&(-p);
}
inline void reset(){
int i, j, k;
for(k=0; k<n; k++){
for(i=y[k]; i<=n; i+=ub(i)){
for(j=z[k]; j<=n; j+=ub(j)){
aib[i][j]=0;
}
}
}
}
inline int query(int a, int b){
int i, j, ans=0;
for(i=a; i>0; i-=ub(i)){
for(j=b; j>0; j-=ub(j)){
if(ans<aib[i][j]){
ans=aib[i][j];
}
}
}
return ans;
}
inline void update(int a, int b, int val){
int i, j;
for(i=a; i<=n; i+=ub(i)){
for(j=b; j<=n; j+=ub(j)){
if(aib[i][j]<val){
aib[i][j]=val;
}
}
}
}
int main(){
int gogu, g, i, ans, k;
FILE *fin, *fout;
fin=fopen("cutii.in", "r");
fout=fopen("cutii.out", "w");
fscanf(fin, "%d%d", &n, &gogu);
for(g=0; g<gogu; g++){
for(i=0; i<n; i++){
fscanf(fin, "%d%d%d", &x[i], &y[i], &z[i]);
}
heapify();
heapSort();
ans=0;
for(i=0; i<n; i++){
k=query(y[i]-1, z[i]-1)+1;
update(y[i], z[i], k);
if(ans<k){
ans=k;
}
}
fprintf(fout, "%d\n", ans);
reset();
}
fclose(fin);
fclose(fout);
return 0;
}