Cod sursa(job #2705415)

Utilizator stefantagaTaga Stefan stefantaga Data 12 februarie 2021 16:16:35
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cutii.in");
ofstream g("cutii.out");
struct wow
{
    int x,y,z;
}v[3505];
int n,aib[3501][3501],din[3505];
int ub (int x)
{
    return x&(-x);
}
void update (int x,int y,int val)
{
    int i,j;
    for (i=x;i<=n;i+=ub(i))
    {
        for (j=y;j<=n;j+=ub(j))
        {
            aib[i][j]=max(aib[i][j],val);
        }
    }
}
int query (int x,int y)
{
    int i,j,maxim=0;
    for (i=x;i>0;i-=ub(i))
    {
        for (j=y;j>0;j-=ub(j))
        {
            maxim=max(maxim,aib[i][j]);
        }
    }
    return maxim;
}
void update2(int x,int y,int val)
{
    int i,j;
    for (i=x;i<=n;i+=ub(i))
    {
        for (j=y;j<=n;j+=ub(j))
        {
            aib[i][j]=val;
        }
    }
}
bool compare (wow a,wow b)
{
    return a.x<b.x||(a.x==b.x&&a.y<b.y)||(a.x==b.x&&a.y==b.y&&a.z<b.z);
}
int t,i,maxim1=0;
int main()
{
    f>>n>>t;
    for (;t--;)
    {
        for (i=1;i<=n;i++)
        {
            f>>v[i].x>>v[i].y>>v[i].z;
        }
        maxim1=0;
        sort (v+1,v+n+1,compare);
        for (i=1;i<=n;i++)
        {
            if (v[i].y==v[i-1].y&&v[i].z==v[i-1].z)
            {
                din[i]=din[i-1];
                continue;
            }
            din[i]=query(v[i].y,v[i].z)+1;
            update(v[i].y,v[i].z,din[i]);
            if (din[i]>maxim1)
            {
                maxim1=din[i];
            }
        }
        for (i=1;i<=n;i++)
        {
            update2(v[i].y,v[i].z,0);
        }
        g<<maxim1<<'\n';
     }
    return 0;
}