Cod sursa(job #2926692)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 18 octombrie 2022 13:53:20
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <bits/stdc++.h>
/// TONI BO$$ was here
/// #MLC

using namespace std;

int n, aib2d[3501][3501];

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

int query(int i, int j)
{
    int z = 0;
    while(i)
    {
        int k = j;
        while(k)
            z = max(z, aib2d[i][k]), k -= zeros(k);
        i -= zeros(i);
    }
    return z;
}

void update(int i, int j, int z)
{
    while(i <= n)
    {
        int k = j;
        while(k <= n)
            aib2d[i][k] = max(aib2d[i][j], z), k += zeros(k);
        i += zeros(i);
    }
}

void free(int i, int j)
{
    while(i <= n)
    {
        int k = j;
        while(k <= n)
            aib2d[i][k] = 0, k += zeros(k);
        i += zeros(i);
    }
}

struct box
{
    int i, j, k;
    bool operator <(const box &oth) const
    {
        return i < oth.i;
    }
}v[3501];

int main()
{
    int t, i, rez;
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    poz = LIM;
    scanf("%d%d", &n, &t);
    while(t--)
    {
        for(i = 0; i < n; i++)
            //v[i].i = getNr(), v[i].j = getNr(), v[i].k = getNr();
            scanf("%d%d%d", &v[i].i, &v[i].j, &v[i].k);
        sort(v, v + n);
        rez = 0;
        for(i = 0; i < n; i++)
        {
            int z = query(v[i].j, v[i].k);
            rez = max(rez, z + 1);
            update(v[i].j, v[i].k, z + 1);
        }
        for(i = 0; i < n; i++)
            free(v[i].j, v[i].k);
        printf("%d\n", rez);
    }

    return 0;
}