Cod sursa(job #1071132)

Utilizator apopeid14Apopei Daniel apopeid14 Data 2 ianuarie 2014 17:14:03
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <algorithm>
using namespace std;
 
ifstream fin ("cutii.in");
ofstream fout ("cutii.out");
 
const int N = 3505;
 
int aib[N][N], sol, n, t;
pair <int, pair <int, int> > v[N];
 
void update (int x, int y, int s) {
    for (int i = x; i <= n; i += (i & -i))
        for (int j = y; j <= n; j += (j & -j))
            aib[i][j] = max (aib[i][j], s);
}
 
void clear(int x, int y) {
    for (int i = x; i <= n; i += (i & -i))
        for (int j = y; j <= n; j += (j & - j))
            aib[i][j] = 0;
}
 
int query (int x, int y) {
    int sol = 0;
    for (int i = x; i; i -= (i & -i))
        for (int j = y; j; j -= (j & -j))
            sol = max (sol, aib[i][j]);
    return sol;
}
 
int main() {
    fin >> n >> t;
    while (t--) {
        sol = 0;
        for (int i = 1; i <= n; ++i)
            fin >> v[i].first >> v[i].second.first >> v[i].second.second;
        sort (v + 1, v + n + 1);
        for (int i = 1; i <= n; ++i) {
            int x = v[i].second.first, y = v[i].second.second;
            int s = query (x - 1, y - 1) + 1;
            sol = max (s, sol);
            update (x, y, s);
        }
        for (int i = 1; i <= n; ++i)
            clear(v[i].second.first, v[i].second.second);
        fout << sol << "\n";
    }
}