Cod sursa(job #1814974)

Utilizator radu_uniculeu sunt radu radu_unicul Data 24 noiembrie 2016 18:22:21
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include<cstdio>
#include<algorithm>
using namespace std;

int n,t;
int aib[3510][3510],d[3510];

struct cutie
{
    int x;
    int y;
    int z;
} v[3510];

bool cmp(cutie a,cutie b)
{
    return a.x<b.x;
}

void aib_update(int x,int y,int value)
{
    for(int i=x; i<=n; i+=i&(-i))
        for(int j=y; j<=n; j+=j&(-j)) if(aib[i][j]<value) aib[i][j]=value;
}

int aib_query(int x,int y)
{
    int s=0;

    for(int i=x; i>=1; i-=i&(-i))
        for(int j=y; j>=1; j-=j&(-j)) if(s<aib[i][j]) s=aib[i][j];

    return s;
}

void aib_reset(int x,int y)
{
    for(int i=x; i<=n; i+=i&(-i))
        for(int j=y; j<=n; j+=j&(-j)) aib[i][j]=0;
}

int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);

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

    for(;t; t--)
    {
        int sol=0;

        for(int 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);

        for(int i=1; i<=n; i++)
        {
            d[i]=aib_query(v[i].y-1,v[i].z-1)+1;
            aib_update(v[i].y,v[i].z,d[i]);
        }

        for(int i=1; i<=n; i++) sol=max(sol,d[i]);

        printf("%d\n",sol);
        for(int i=1; i<=n; i++)aib_reset(v[i].y,v[i].z);
    }

}