Cod sursa(job #2115380)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 26 ianuarie 2018 17:58:58
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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 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 1+ans;
}
int main()
{
    fscanf(IN,"%d%d",&N,&T);
    for(int t=1;t<=T;t++)
    {
        memset(aib,0,sizeof aib);
        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 p=1,Max=0;
        for(int i=1;i<=N;i++)
        {
            while(v[p].x<v[i].x)
                Update(v[p].y,v[p].z,d[p]),p++;
            d[i]=Query(v[i].y-1,v[i].z-1);
            Max=max(Max,d[i]);
        }
        fprintf(OUT,"%d\n",Max);
    }
    return 0;
}