Cod sursa(job #1331196)

Utilizator livliviLivia Magureanu livlivi Data 31 ianuarie 2015 13:07:51
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<algorithm>
#include<cstdio>
#define m(x) x&(-x)
#define MAX 3500
using namespace std;
struct mazi{int l,L,h;};


int aib[MAX+1][MAX+1];

int n;
mazi v[MAX+1];


void clear(int x,int y){
    int i,j;

    for(i=x;i<=n;i+=m(i))
        for(j=y;j<=n &&aib[i][j]!=0;j+=m(j))
            aib[i][j]=0;
}

void update(int x,int y,int ce){
    int i,j;

    for(i=x;i<=n;i+=m(i))
        for(j=y;j<=n &&aib[i][j]<ce;j+=m(j))
            aib[i][j]=ce;
}

int query(int x,int y){
    int i,j,max=0;

    for(i=x;i>0;i-=m(i))
        for(j=y;j>0;j-=m(j))
            if (aib[i][j]>max) max=aib[i][j];
    return max;
}

bool meow(mazi a,mazi b){
    if (a.l<b.l) return true;
    return false;
}


int main(){
    freopen ("cutii.in","r",stdin);
    freopen ("cutii.out","w",stdout);
    int t,i,j,max,rez;

    scanf ("%d%d",&n,&t);

    for(j=1;j<=t;j++){
        for(i=1;i<=n;i++)
            scanf ("%d%d%d",&v[i].l,&v[i].L,&v[i].h);

        sort(v+1,v+n+1,meow);

        max=0;
        for(i=1;i<=n;i++){
            rez=query(v[i].L-1,v[i].h-1)+1;
            if (max<rez) max=rez;

            update(v[i].L,v[i].h,rez);
        }

        printf ("%d\n",max);

        for(i=1;i<=n;i++)
            clear(v[i].L,v[i].h);
    }

    return 0;
}