Cod sursa(job #2115405)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 26 ianuarie 2018 18:27:31
Problema Cutii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <bits/stdc++.h>

#define INF 2140000000
#define MOD 1000000007
#define MaxN 3505
#define lsb(i) (x&(-x))

using namespace std;

FILE*IN=fopen("cutii.in","r"),*OUT=fopen("cutii.out","w");

int T,N,aib[MaxN][MaxN],d[MaxN];
struct box
{
    int x,y,z;
}v[MaxN];
bool cond(box a,box b)
{
    return a.x<b.x;
}
inline void Update(int x,int y,int val)
{
    for(int i=x;i<=N;i+=lsb(i))
        for(int j=y;j<=N;j+=lsb(j))
            aib[i][j]=max(aib[i][j],val);
}
inline void Clear(int x,int y)
{
    for(int i=x;i<=N;i+=lsb(i))
        for(int j=y;j<=N;j+=lsb(j))
            aib[i][j]=0;
}
inline int Query(int x,int y)
{
    int ans=0;
    for(int i=x;i>0;i-=lsb(i))
        for(int j=y;j>0;j-=lsb(j))
            ans=max(aib[i][j],ans);
    return ans;
}
int main()
{
    fscanf(IN,"%d%d",&N,&T);
    for(int t=1;t<=T;t++)
    {
        for(int i=1;i<=N;i++)
            fscanf(IN,"%d%d%d",&v[i].x,&v[i].y,&v[i].z);
        sort(v+1,v+1+N,cond);
        int Max=0;
        for(int i=1;i<=N;i++)
        {
            int Val=Query(v[i].y,v[i].z)+1;
            Update(v[i].y,v[i].z,Val);
            Max=max(Max,Val);
        }
        for(int i=1;i<=N;i++)
            Clear(v[i].y,v[i].z);
        fprintf(OUT,"%d\n",Max);
    }
    return 0;
}