Cod sursa(job #1231337)

Utilizator ArchazeyBaltatu Andrei-Mircea Archazey Data 20 septembrie 2014 12:30:26
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<bits/stdc++.h>
using namespace std;

struct cell
{
    int x,y,z;
};

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

const int NMAX=3505;

int n,t,AIB[NMAX][NMAX];
cell a[NMAX];

inline int zeros(int x)
{
    return x^(x&(x-1));
}

inline void UPDATE1(int x,int y,int val)
{
    int i,j;
    for (i=x;i<=n;i+=zeros(i))
        for (j=y;j<=n;j+=zeros(j))
            AIB[i][j]=max(AIB[i][j],val);
};

inline void UPDATE0(int x,int y)
{
    int i,j;
    for (i=x;i<=n;i+=zeros(i))
        for (j=y;j<=n;j+=zeros(j))
            AIB[i][j]=0;
}

inline int QUERY(int x,int y)
{
    int i,j,rez=0;
    for (i=x;i>=1;i-=zeros(i))
        for (j=y;j>=1;j-=zeros(j))
            rez=max(rez,AIB[i][j]);
    return rez;
}

inline bool cmp(const cell A,const cell B)
{
    if (A.x==B.x)
        {
           if (A.y==B.y) return A.z<B.z;
           return A.y<B.y;
        }
    return A.x<B.x;
}

int main()
{
    int i,maxim,aux;
    fin>>n>>t;
    while (t--)
        {
            for (i=1;i<=n;i++) fin>>a[i].x>>a[i].y>>a[i].z;
            sort(a+1,a+n+1,cmp);
            maxim=0;
            for (i=1;i<=n;i++)
                {
                    aux=1+QUERY(a[i].y-1,a[i].z-1);
                    maxim=max(maxim,aux);
                    UPDATE1(a[i].y,a[i].z,aux);
                }
            for (i=1;i<=n;i++) UPDATE0(a[i].y,a[i].z);
            fout<<maxim<<"\n";
        }
    return 0;
}