Cod sursa(job #1231313)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 20 septembrie 2014 11:48:32
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <algorithm>
#define DIM 3505
#define lsb(x) (x&(-x))
#define infile "cutii.in"
#define outfile "cutii.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

struct data {
    int x;
    int y;
    int z;
} v[DIM];

bool cmp (const data &a, const data &b) {
    return a.z < b.z;
}

int maxim, n, Max, t;

int A[DIM][DIM];

void query(int p, int q) {
    for (int i=p; i>0; i-=lsb(i))
        for (int j=q; j>0; j-=lsb(j))
            maxim = std::max(A[i][j], maxim);
}

void update(int p, int q) {
    for (int i=p; i<=n; i+=lsb(i))
        for (int j=q; j<=n; j+=lsb(j))
            A[i][j] = std::max(A[i][j], maxim);
}

int main () {
    f >> n >> t;
    for (; t; --t) {
        for (int i=1; i<=n; ++i)
            f >> v[i].x >> v[i].y >> v[i].z;

        sort(v+1,v+n+1,cmp);
        Max = 0;
        for (int i=1; i<=n; ++i) {
            maxim = 0;
            query(v[i].x-1, v[i].y-1);
            maxim++;
            Max = std::max(Max, maxim);
            update(v[i].x, v[i].y);
        }
        g << Max << "\n";
        for (int i=1; i<=n; ++i) {
            for (int k=v[i].x; k<=n; k+=lsb(k))
                for (int j=v[i].y; j<=n; j+=lsb(j))
                    A[k][j] = 0;
        }
    }



    return 0;
}