Cod sursa(job #222706)

Utilizator savimSerban Andrei Stan savim Data 24 noiembrie 2008 19:24:07
Problema Cutii Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_L 3600

int n, t, i, j, k, sol, x;
int a[MAX_L][3], v[MAX_L];
int aib[MAX_L][MAX_L];

void cit() {
     freopen("cutii.in", "r", stdin);
     freopen("cutii.out", "w", stdout);
     
     scanf("%d %d", &n, &t);
}

inline int cmp(int x, int y) {
       return a[x][2] < a[y][2];
}

inline int lsb(int x) {
       return x ^ (x & (x - 1));
}

int query(int x, int y) {
    int nr = 0;
    for (int i = x; i > 0; i -= lsb(i))
        for (int j = y; j > 0; j -= lsb(j))
            if (nr < aib[i][j]) nr = aib[i][j];
    return nr; 
}

void update(int x, int y, int k) {
     for (int i = x; i <= n; i += lsb(i))
         for (int j = y; j <= n; j += lsb(j))
             if (aib[i][j] < k) aib[i][j] = k;
}

void solve() {
     while (t) {
           sol = 0; t--;
           for (i = 1; i <= n; v[i] = i, i++)
               scanf("%d %d %d", &a[i][0], &a[i][1], &a[i][2]);
           for (i = 0; i <= n; i++)
               for (j = 0; j <= n; j++)
                   aib[i][j] = 0;
           
           sort(v + 1, v + n + 1, cmp);
     
           for (i = 1; i <= n; i++) {
               x = query(a[v[i]][0] - 1, a[v[i]][1] - 1) + 1;
               if (x > sol) sol = x;
               update(a[v[i]][0], a[v[i]][1], x);
           }
           
           printf("%d\n", sol);
     }
}

int main() {

    cit();
    solve();

    return 0;
}