Cod sursa(job #228818)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 8 decembrie 2008 12:05:42
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <set>
#include <algorithm>

using namespace std;

short int n, i, j, k, aib[3510][3510], a, b, c, v[3510][10], rez, l, t;

pair <short int, pair<short int, short int> > p[3510];

short int lsb(short int x)
{
    return x&(x-1)^x;
}

short int query(short int a, short int b)
{
    short int x, y, z;
    z=0;
    for(x=a; x>0; x-=lsb(x))
    {
        for(y=b; y>0; y-=lsb(y))
        {
            if(aib[x][y]>z) z=aib[x][y];
        }
    }
    return z;
}

void update(short int a, short int b)
{
    short int x, y;
    for(x=a; x<=n; x+=lsb(x))
    {
        for(y=b; y<=n; y+=lsb(y))
        {
            if(aib[x][y]<k+1) aib[x][y]=k+1;
        }
    }
}

int main()
{
    freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);
    scanf("%d %d", &n, &t);
    for(l=1; l<=t; l++)
    {    
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            aib[i][j]=0;
        }
        rez=0;
        for(i=1; i<=n; i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            p[i]=make_pair(a, make_pair(b, c));
        }
        sort(p+1, p+n+1);
        for(i=1; i<=n; i++)
        {
            v[i][0]=p[i].second.first;
            v[i][1]=p[i].second.second;
            k=query(v[i][0]-1, v[i][1]-1);
            if(k+1>rez) rez=k+1;
            update(v[i][0], v[i][1]);
        }
        printf("%d\n", rez);
    }
    return 0;
}