Cod sursa(job #2438037)

Utilizator Alex_BubBuburuzan Alexandru Alex_Bub Data 11 iulie 2019 02:08:41
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin("cutii.in");
ofstream fout("cutii.out");

const int NMax = 3500;

int N, T, AIT[NMax + 5][NMax + 5];
struct str{int x, y;} V[NMax + 5];

void Update(int a, int b, int val)
{
    for(int i = a; i <= N; i += i & (-i))
        for(int j = b; j <= N; j += j & (-j))
                AIT[i][j] = max(AIT[i][j], val);
}

void Delete(int a, int b)
{
    for(int i = a; i <= N; i += i & (-i))
        for(int j = b; j <= N; j += j & (-j))
                AIT[i][j] = 0;
}

int Querry(int a, int b)
{
    int Sol = 0;

    for(int i = a; i > 0; i -= i & (-i))
        for(int j = b; j > 0; j -= j & (-j))
            Sol = max(Sol, AIT[i][j]);

    return Sol;
}

int main()
{
    fin >> N >> T;

    while(T--)
    {
        int Ans = 0;

        for(int i = 1, a; i <= N; i++)
        {
            fin >> a;
            fin >> V[a].x >> V[a].y;
        }

        for(int i = 1; i <= N; i++)
        {
            int val = Querry(V[i].x, V[i].y) + 1;
            Update(V[i].x, V[i].y, val);
            Ans = max(Ans, val);
        }
        fout << Ans << '\n';

        for(int i = 1; i <= N; i++)
            Delete(V[i].x, V[i].y);
    }
    fin.close();
    fout.close();

    return 0;
}