Cod sursa(job #2938744)

Utilizator AswVwsACamburu Luca AswVwsA Data 12 noiembrie 2022 15:48:20
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
//interesant sa folosesti aib pentru maxim, doar pentru
//ca ni se cere maxim pe un interval de genul (1, 1) -> (n, m)
//#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

//dp[i] = nr. max. de cutii ce pot fi alese cu cutia i fiind ultima

//dp[i] = 1 + max(dp[j]), cu dimensiunile cutii lui j mai mari ca ale lui i
const int NMAX = 3500;

struct cub
{
    int x, y, z;
} v[NMAX + 3];


bool cmp(cub a, cub b)
{
    return a.x < b.x;
}

int n;
int aib[NMAX + 1][NMAX + 1];
void update(int i, int j, int val)
{
    for (; i <= n; i += i & -i)
        for (int x = j; x <= n; x += x & -x)
            aib[i][x] = max(aib[i][x], val);
}

int query(int a, int b)
{
    int ans = 0;
    for (; a >= 1; a -= a & -a)
        for (int x = b; x >= 1; x -= x & -x)
            ans = max(ans, aib[a][x]);
    return ans;
}
int aux[NMAX + 1];



void sterge(int a, int b)
{
    for (; a <= n; a += a & -a)
        for (int x = b; x <= n; x += x & -x)
            aib[a][x] = 0;
}
int main()
{
    int t, i, j;
    ifstream cin("cutii.in");
    ofstream cout("cutii.out");
    cin >> n >> t;
    while (t--)
    {
        int ans = 0;
        for (i = 1; i <= n; i++)
        {
            cin >> v[i].x >> v[i].y >> v[i].z;
        }
        sort(v + 1, v + n + 1, cmp);
        int last = 1;
        for (i = 1; i <= n; i++)
        {
            if (v[i].x != v[last].x)
            {
                for (j = last; j < i; j++)
                {
                    aux[j] = 1 + query(v[j].y - 1, v[j].z - 1);
                    ans = max(ans, aux[j]);
                }
                for (j = last; j < i; j++)
                {
                    update(v[j].y, v[j].z, aux[j]);
                }
                last = i;
            }
        }
        for (j = last; j < i; j++)
        {
            aux[j] = 1 + query(v[j].y - 1, v[j].z - 1);
            ans = max(ans, aux[j]);
        }
        for (j = last; j < i; j++)
        {
            update(v[j].y, v[j].z, aux[j]);
        }
        cout << ans << "\n";
        for (i = 1; i <= n; i++)
        {
            sterge(v[i].y, v[i].z);
        }
    }
}