Cod sursa(job #2672259)

Utilizator matei123Biciusca Matei matei123 Data 13 noiembrie 2020 16:08:43
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<bits/stdc++.h>
#define ub(x) x & (-x)
#define NMAX 3505
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");

int n, t, aib[NMAX][NMAX];
vector < pair <int, int> > v;

void update(int x, int y, int val)
{   for (int i = x; i <= n; i += ub(i))
        for (int j = y; j <= n; j += ub(j))
            aib[i][j] = max(val, aib[i][j]);
}

int query(int x, int y)
{   int val = 0;
    for (int i = x; i; i -= ub(i))
        for (int j = y; j; j -= ub(j))
            val = max(val, aib[i][j]);
    return val;
}

void clear(int x, int y)
{   for (int i = x; i <= n; i += ub(i))
        for (int j = y; j <= n; j += ub(j))
            aib[i][j] = 0;
}

int main()
{   fin >> n >> t;
    v.resize(n+1);
    while (t--)
    {   int maxi = 0, x, y, z;
        for (int i = 1; i <= n; ++i)
        {   fin >> x >> y >> z;
            v[z] = make_pair(x, y);
        }
        for (int i = 1; i <= n; ++i)
        {   int cnt = query(v[i].first - 1, v[i].second - 1) + 1;
            maxi = max(maxi, cnt);
            update(v[i].first, v[i].second, cnt);
        }
        fout << maxi << "\n";
        for (int i = 1; i <= n; ++i)
            clear(v[i].first, v[i].second);
    }
    fout.close();
    return 0;
}