Cod sursa(job #780472)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 20 august 2012 16:58:20
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <algorithm>
#include <cstring>

#define MAX 3505

using namespace std;

struct cutie
{
    int x, y, z;
}v[MAX];

int aib[MAX][MAX], D[MAX], n, t, sol;

bool cmp(cutie a, cutie b)
{
    return a.x < b.x;
}

int query(int x, int y)
{
    int i, j, res = 0;
    for(i = x; i; i -= i ^ (i - 1) & i)
        for(j = y; j; j -= j ^ (j - 1) & j)
            res = max(res, aib[i][j]);
    return res;
}

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

int main()
{
    ifstream in("cutii.in"); in>>n>>t;
    ofstream out("cutii.out");
    while(t--)
    {
        for(int i = 1; i <= n; i++) in>>v[i].x>>v[i].y>>v[i].z;
        sol = 0;
        sort(v + 1, v + n + 1, cmp);
        for(int i = 1; i <= n; i++)
        {
            D[i] = query(v[i].y - 1, v[i].z - 1) + 1;
            update(v[i].y, v[i].z, D[i]);
            if(D[i] > sol)
                sol = D[i];
        }
        out<<sol<<"\n";
        for(int i = 1; i <= n; i++)
            memset(aib[i], 0, MAX * sizeof(int));
    }
    in.close(); out.close();
    return 0;
}