Cod sursa(job #2078900)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 30 noiembrie 2017 11:34:43
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

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

int n,t,aib[3505][3505];

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

void update(int px,int py,int val)
{
    while(px>0)
    {
        while(py>0)
        {
            aib[px][py] = max(aib[px][py],val);
            py -= py&(-py);
        }
        px -= px&(-px);
    }
}

int query(int px,int py)
{
    int ma=0;
    while(px<=n)
    {
        while(py<=n)
        {
            ma=max(ma,aib[px][py]);
            py += py &(-py);
        }
        px += px & (-px);
    }
    return ma;
}

void clearr(int px,int py)
{
    while(px>0)
    {
        while(py>0)
        {
            aib[px][py] = 0;
            py -= py&(-py);
        }
        px -= px&(-px);
    }
}

inline bool cmp(element a, element 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()
{
    fscanf(in,"%d%d",&n,&t);
    while(t)
    {
        int ans=0;
        vector <element> v;
        v.push_back({0,0,0});
        for(int i=1;i<=n;i++)
            {
                int x ,y,z;
                fscanf(in,"%d%d%d",&x,&y,&z);
                v.push_back({x,y,z});
            }
        sort(v.begin()+1,v.end(),cmp);
        for(int i=n;i>=1;i--)
            {
                int sol=query(v[i].y + 1,v[i].z + 1)+1;
                ans=max(sol,ans);
                update(v[i].y,v[i].z,sol);
            }
        fprintf(out,"%d\n",ans);
        for(int i=n;i>=1;i--)
            clearr(v[i].y,v[i].z);
        t--;
    }
    return 0;
}