Cod sursa(job #1231111)

Utilizator mariusn01Marius Nicoli mariusn01 Data 19 septembrie 2014 16:17:21
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <fstream>
#include <algorithm>
#include <cstring>

#define DIM 3510

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

struct cutie {
    int x;
    int y;
    int z;
};

int A[DIM][DIM];
int n, i, x, sol, t, y;
cutie v[DIM];

int cmp(const cutie &a, const cutie &b) {
    return a.z<b.z;
}

int query(int x, int y) {
    int r = 0;
    for (int i=x;i;i-=(i&-i))
        for (int j=y;j;j-=(j&-j))
            r = max(r, A[i][j]);
    return r;
}

void update(int x, int y, int z) {
    for (int i = x;i<=n;i+=(i&-i))
        for (int j = y;j<=n;j+=(j&-j))
            A[i][j] = max(A[i][j], z);
}

int main() {
    fin>>n>>t;
    for (;t--;) {

        sol = 0;
        for (i=1;i<=n;i++)
            fin>>v[i].x>>v[i].y>>v[i].z;

        sort(v+1, v+n+1, cmp);

        for (i=1;i<=n;i++){
            x = 1 + query(v[i].x-1, v[i].y-1);
            update(v[i].x, v[i].y, x);
            sol = max(sol, x);
        }

        fout<<sol<<"\n";

        for (i=1;i<=n;i++)
            for (x = v[i].x;x<=n;x+=(x&-x))
                for (y=v[i].y; y<=n; y+=(y&-y))
                    A[x][y] = 0;

    }

    return 0;
}