Cod sursa(job #616714)

Utilizator mihai995mihai995 mihai995 Data 13 octombrie 2011 10:21:41
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <algorithm>
using namespace std;

const int N=3501,inf=1<<30;
struct cutie{int x,y,z;} box[N],stack[N*N];
int v[N][N],a[N],n,rez,M,D;
bool lazy[N][2*N];

ifstream in("cutii.in");
ofstream out("cutii.out");

inline bool cmp(const cutie& a,const cutie& b)
{
    return a.z<b.z;
}

inline int max(int a,int b)
{
    return a>b ? a : b;
}

inline int pas(int x)
{
    return x&-x;
}

inline int push(int x,int y)
{
    stack[++D]=(cutie){x,y,0};
}

inline void pop(int& x,int& y)
{
    x=stack[D].x;
    y=stack[D].y;
    D--;
}

void update(int x,int t)
{
    for (;x<=n;x+=pas(x))
        for (int y=t;y<=n;y+=pas(y))
        {
            v[x][y]=max(v[x][y],a[t]);
            push(x,y);
        }
}

int query(int x,int t)
{
    rez=0;
    for (;x;x-=pas(x))
        for (int y=t;y;y-=pas(y))
        {
            rez=max(rez,v[x][y]);
            push(x,y);
        }
    return rez;
}

void init()
{
    int x,y;
    while(D)
    {
        pop(x,y);
        v[x][y]=0;
    }
}

int main()
{
    int t,i;
    in>>n>>t;
    while (t--)
    {
        init();
        for (i=1;i<=n;i++)
            in>>box[i].x>>box[i].y>>box[i].z;
        sort(box+1,box+n+1,cmp);
        for (i=1;i<=n;i++)
        {
            a[box[i].y]=1+query(box[i].x,box[i].y);
            update(box[i].x,box[i].y);
        }
        M=a[1];
        for (i=2;i<=n;i++)
            if (M<a[i])
                M=a[i];
        out<<M<<"\n";
    }
    return 0;
}