Cod sursa(job #1802412)

Utilizator ipus1Stefan Enescu ipus1 Data 10 noiembrie 2016 11:55:10
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include<cstdio>
#include<algorithm>
using namespace std;
struct aa{int x,y,z;};
aa v[3501];
int aib[3501][3501],n,maxx;
bool sortare(aa a, aa b)
    {if(a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.z<b.z))
        return 1;
    return 0;
    }
void query(int x,int y)
    {int i,j;
    for(i=x;i>=1;i-=(i&(-i)))
        for(j=y;j>=1;j-=(j&(-j)))
            if(aib[i][j]>maxx)
                maxx=aib[i][j];
    }
void update(int x,int y)
    {int i,j,k;
    k=aib[x][y];
    for(i=x;i<=n;i+=(i&(-i)))
        for(j=y;j<=n;j+=(j&(-j)))
            if(aib[i][j]<k)
                aib[i][j]=k;
    }
void f()
    {int i,j,x,k,q,maxtot;
    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,sortare);
    maxtot=0;
    for(i=1;i<=n;i++)
        {maxx=0;
        query(v[i].y-1,v[i].z-1);
        maxx++;
        if(aib[v[i].y][v[i].z]<maxx)
            {aib[v[i].y][v[i].z]=maxx;
            update(v[i].y,v[i].z);
            }
        if(maxx>maxtot)
            maxtot=maxx;
        }
    printf("%d\n",maxtot);
    for(i=1;i<=n;i++)
        {aib[v[i].y][v[i].z]=0;
        update(v[i].y,v[i].z);
        }
    }
int main ()
{freopen ("cutii.in","r",stdin);
freopen ("cutii.out","w",stdout);
int t,i;
scanf("%d%d",&n,&t);
for(i=1;i<=t;i++)
    f();
return 0;
}