Cod sursa(job #788535)

Utilizator visanrVisan Radu visanr Data 15 septembrie 2012 11:57:14
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <cmath>
#include <algorithm>
using namespace std;


struct data
{
       int x, y, z;
}V[3510];
int aib[3510][3510], sol[3510], ans, N, T;


bool cmp(data one, data two)
{
     return one.x < two.x;
}

void UpdateMax(int pos1, int pos2, int val)
{
     for(int i = pos1; i <= N; i += (i & (-i)))
           for(int j = pos2; j <= N; j += (j & (-j)))
                 aib[i][j] = max(aib[i][j], val);
}

void UpdateOut(int pos1, int pos2)
{
     for(int i = pos1; i <= N; i += (i & (-i)))
           for(int j = pos2; j <= N; j += (j & (-j)))
                 aib[i][j] = 0;
}

int Query(int pos1, int pos2)
{
    int S = 0;
    for(int i = pos1; i; i -= (i & (-i)))
          for(int j = pos2; j; j -= (j & (-j)))
                S = max(S, aib[i][j]);
    return S;
}

int main()
{
    ifstream in("cutii.in");
    ofstream out("cutii.out");
    int i;
    in >> N >> T;
    for(; T; T --)
    {
          for(i = 1; i <= N; i++)
                in >> V[i].x >> V[i].y >> V[i].z;
          sort(V + 1, V + N + 1, cmp);
          ans = 0;
          for(i = 1; i <= N; i++)
          {
                sol[i] = Query(V[i].y - 1, V[i].z - 1) + 1;
                ans = max(ans, sol[i]);
                UpdateMax(V[i].y, V[i].z, sol[i]);
          }
          for(i = 1; i <= N; i++)
                UpdateOut(V[i].y, V[i].z);
          out << ans << "\n";
    }
    return 0;
}