Cod sursa(job #228817)

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

using namespace std;

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

pair <long, pair<long, long> > p[3510];

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

long query(long a, long b)
{
    long 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(long a, long b)
{
    long 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;
}