Cod sursa(job #1528965)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 20 noiembrie 2015 12:11:05
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct cutie{int x,y,z;};
cutie v[3600];
int aib[3510][3510],n;
bool cmp(cutie a,cutie b){
    return a.x>b.x;
}
int maxim(int a,int b){
    if(a<b)
        return b;
    return a;
}
int lsb(int x){
    return x&(-x);
}
void update(int y,int z,int value){
    int i,j;
    for(i=y;i>0;i-=lsb(i))
        for(j=z;j>0;j-=lsb(j))
            aib[i][j]=maxim(aib[i][j],value);
}
int query(int y,int z){
    int answer=0,i,j;
    for(i=y;i<=n;i+=lsb(i))
        for(j=z;j<=n;j+=lsb(j))
            answer=maxim(answer,aib[i][j]);
    return answer;
}
void reset(int y,int z){
    int i,j;
    for(i=y;i>0;i-=lsb(i))
        for(j=z;j>0;j-=lsb(j))
            aib[i][j]=0;
}
int main(){
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    int t,q,i,j,answer,value;
    scanf("%d%d",&n,&t);
    for(q=1;q<=t;q++){
        for(i=1;i<=n;i++)
            scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
        sort(v+1,v+n+1,cmp);
        answer=1;
        update(v[1].y,v[1].z,1);
        for(i=2;i<=n;i++){
            value=query(v[i].y,v[i].z)+1;
            answer=maxim(answer,value);
            update(v[i].y,v[i].z,value);
        }
        for(i=1;i<=n;i++)
            reset(v[i].y,v[i].z);
        printf("%d\n",answer);
    }
    return 0;
}