Cod sursa(job #1814132)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 23 noiembrie 2016 18:02:48
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <fstream>
#include <algorithm>
#define x first
#define y second.x
#define z second.second
#define ub(i) (i & (-i))
using namespace std;

ifstream f ("cutii.in");
ofstream g ("cutii.out");

pair<int,pair<int,int>> v[3503];
int N, T, AIB[3150][3150];

void add(int p1, int p2) {
    for(int i = p1; i <= N; i += ub(i))
        for(int j = p2; j <= N; j += ub(j))
            AIB[i][j] = max(AIB[i][j], AIB[p1][p2]);
}

int query(int p1, int p2) {
    int rez = 0;
    for(int i = p1 - 1; i >= 1; i -= ub(i))
        for(int j = p2 - 1; j >= 1; j -= ub(j))
            rez = max(rez, AIB[i][j]);
    return rez;
}

void del(int p1, int p2) {
    for(int i = p1; i <= N; i += ub(i))
        for(int j = p2; j <= N; j += ub(j))
            AIB[i][j] = false;
}
int main()
{
    f >> N >> T;
    for(; T >= 1; T--) {
        for(int i = 1; i <= N; i++)
            f >> v[i].x >> v[i].y >> v[i].z;
        sort(v+1, v+N+1);
        int MAX = 0;
        for(int i = 1; i <= N; i++) {
            int x = query(v[i].y, v[i].z) + 1;
            AIB[v[i].y][v[i].z] = x;
            add(v[i].y, v[i].z);

            MAX = max(MAX, x);
        }

        for(int i = 1; i <= N; i++)
            del(v[i].y, v[i].z);
        g << MAX << "\n";
    }
    return 0;
}