Cod sursa(job #1418142)

Utilizator Liviu98Dinca Liviu Liviu98 Data 11 aprilie 2015 23:37:47
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<algorithm>
#include<cstdio>
#define bit(x) x&(-x)
#define MAX 3500
using namespace std;
struct cutie
{
    int l,L,h;
};
int AIB[MAX+1][MAX+1];

int n;
cutie v[MAX+1];

void Curata(int x,int y)
{

    for(int i=x;i<=n;i+=bit(i))
        for(int j=y;j<=n &&AIB[i][j]!=0;j+=bit(j))
            AIB[i][j]=0;
}

void Update(int x,int y,int valoare)
{
    for(int i=x;i<=n;i+=bit(i))
        for(int j=y;j<=n &&AIB[i][j]<valoare;j+=bit(j))
            AIB[i][j]=valoare;
}

int Query(int x,int y)
{
    int Max=0;

    for(int i=x;i>0;i-=bit(i))
        for(int j=y;j>0;j-=bit(j))
            if (AIB[i][j]>Max) Max=AIB[i][j];
    return Max;
}

bool meow(cutie a,cutie 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++)
            Curata(v[i].L,v[i].h);
    }

    return 0;
}