Cod sursa(job #1733339)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 24 iulie 2016 14:31:39
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n,aib[3510][3510];

struct punct
{
    int x,y,z;
    bool operator <(const punct &aux) const
    {
        return z<aux.z;
    }
};

punct v[3510];

void aib_update(int a,int b,int val)
{
    for(int i=a;i<=n;i+=i&(-i))
        for(int j=b;j<=n;j+=j&(-j))
            aib[i][j]=max(aib[i][j],val);
}

int aib_query(int a,int b)
{
    int s=0;
    for(int i=a;i>0;i-=i&(-i))
        for(int j=b;j>0;j-=j&(-j))
            s=max(s,aib[i][j]);
    return s;
}

void aib_delete(int a,int b)
{
     for(int i=a;i<=n;i+=i&(-i))
        for(int j=b;j<=n;j+=j&(-j))
            aib[i][j]=0;
}

int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    int t,r,s;
    scanf("%d%d",&n,&t);
    for(int test=1;test<=t;test++)
    {
        r=0;s=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);
        for(int i=1;i<=n;i++)
        {
            s=aib_query(v[i].x-1,v[i].y-1)+1;
            r=max(r,s);
            aib_update(v[i].x,v[i].y,s);
        }
        printf("%d\n",r);
        for(int i=1;i<=n;i++)
            aib_delete(v[i].x,v[i].y);
    }
    return 0;
}