Cod sursa(job #1522239)

Utilizator andru47Stefanescu Andru andru47 Data 11 noiembrie 2015 14:07:54
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define ub(x) (x&(-x))
#define x first
#define y second.x
#define z second.second
using namespace std;
const int NMAX = 3500+10;
pair < int,pair<int , int> > v[NMAX];
int aib[NMAX][NMAX],n,T;
inline void edd(int xX , int yY)
{
    for (int i = xX ; i <= n; i+=ub(i))
        for (int j = yY; j <= n ; j+=ub(j))
            aib[i][j]=max(aib[i][j],aib[xX][yY]);
    return ;
}
inline int query(int xX , int yY)
{
    int res=0;
    for (int i = xX - 1 ; i ; i-=ub(i))
        for (int j = yY-1 ; j ; j-=ub(j))
            res=max(aib[i][j],res);
    return res;
}
inline void dilit(int xX , int yY)
{
    for (int i = xX ; i <= n; i+=ub(i))
        for (int j = yY; j <= n ; j+=ub(j))
            aib[i][j]=0;
    return ;
}
int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d %d\n",&n,&T);
    for ( ; T ; --T)
    {
        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);
        int result = 0;
        for (int i = 1; i<=n ; ++i)
        {
            int s = 1 + query(v[i].y,v[i].z);
            result=max(result,s);
            aib[v[i].y][v[i].z]=s;
            edd(v[i].y,v[i].z);
        }
        printf("%d\n",result);
        for (int i = 1 ; i <= n ; ++i)
            dilit(v[i].y,v[i].z);
    }
    return 0;
}