Cod sursa(job #788531)

Utilizator visanrVisan Radu visanr Data 15 septembrie 2012 11:51:38
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <cstdlib>
#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(; pos1 <= N; pos1 += (pos1 & (-pos1)))
           for(; pos2 <= N; pos2 += (pos2 & (-pos2)))
                 aib[pos1][pos2] = max(aib[pos1][pos2], val);
}

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

int Query(int pos1, int pos2)
{
    int sum = 0;
    for(; pos1; pos1 -= (pos1 & (-pos1)))
          for(; pos2; pos2 -= (pos2 & (-pos2)))
                sum += aib[pos1][pos2];
    return sum;
}

int main()
{
    freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);
    int i;
    scanf("%i %i", &N, &T);
    for(; T; T --)
    {
          for(i = 1; i <= N; i++)
                scanf("%i %i %i", &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);
          printf("%i\n", ans);
    }
    return 0;
}