Cod sursa(job #1528963)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 20 noiembrie 2015 12:03:49
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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){
    if(a.x<b.x)
        return true;
    return false;
}
int lsb(int x){
    return x&(-x);
}
void update(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]++;
}
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+=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]--;
}
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[n].y,v[n].z);
        for(i=n-1;i>=1;i--){
            value=query(v[i].y,v[i].z)+1;
            if(value>answer)
                answer=value;
            update(v[i].y,v[i].z);
        }
        for(i=1;i<=n;i++)
            reset(v[i].y,v[i].z);
        printf("%d\n",answer);
    }
    return 0;
}