Cod sursa(job #1409509)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 30 martie 2015 16:06:24
Problema Cutii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int max2(int a,int b){
    if(a>b)
        return a;
    return b;
}
const int N=3500;
class Box{
    public:
        int x,y,z;
        Box(){
        }
        Box(int xx,int yy,int zz){
            x=xx;
            y=yy;
            z=zz;
        }
        bool operator<(const Box&b)const{
            return x<b.x;
        }
};
int aib[N+1][N+1];
Box v[N+1];
int n,t;
int d[N+1];
int query(int x,int y){
    int r=0;
    int cy=y;
    while(x){
        y=cy;
        while(y){
            r=max2(r,d[aib[x][y]]);
            y-=y&(-y);
        }
        x-=x&(-x);
    }
    return r;
}
void update(int x,int y,int val){
    int cy=y;
    while(x<=n){
        y=cy;
        while(y<=n){
            if(d[aib[x][y]]<d[val])
                aib[x][y]=val;
            y+=y&(-y);
        }
        x+=x&(-x);
    }
}
int main(){
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d%d",&n,&t);
    while(t--){
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
        memset(aib,0,sizeof(aib));
        memset(d,0,sizeof(d));
        sort(v+1,v+n+1);
        int res=0;
        for(int i=1;i<=n;i++){
            d[i]=d[query(v[i].y,v[i].z)]+1;
            res=max2(res,d[i]);
            update(v[i].y,v[i].z,i);
        }
        printf("%d\n",res);
    }
    return 0;
}