Cod sursa(job #222794)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 25 noiembrie 2008 12:07:15
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <algorithm>
#define oo (1<<29)
#define mp make_pair
#define pb push_back
#define sh short int
#define N 3501
using namespace std;
sh n,t;
class cutii{
    public:
    sh a,b,c;
};
vector<cutii> V;
sh aib[N][N];
inline cutii mc(sh a,sh b,sh c){
    return (cutii){a,b,c};
}
inline bool cmp(cutii a,cutii b){
    return a.c < b.c;
}
int Sol = 0;
inline sh lsb(sh x){
    return (sh)((x^(x-1))&x);
}
void update(sh a,sh b,sh nr){
    sh i,j;
    for (i = a; i <= n; i += lsb(i))
        for (j = b; j <= n; j += lsb(j))
            if (nr > aib[i][j])
                aib[i][j] = nr;
}
sh query(sh a,sh b){
    sh i,j,tmp = 0;
    for (i = a; i; i -= lsb(i))
        for (j = b; j; j -= lsb(j))
            tmp = max(tmp, aib[i][j]);
    return tmp;
}
int main(){
    int i;
    sh a,b,c,Now;
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%hu%hu",&n,&t);
    while (t--){
        V.clear();
        V.push_back(mc(-30000,-30000,-30000));
        Sol = 0;
        memset(aib,0,sizeof(aib));
        for (i = 1; i <= n; ++i){
            scanf("%hu%hu%hu",&a,&b,&c);
            V.pb(mc(a,b,c));
        }
        sort(V.begin(),V.end(),cmp);
        for (i = 1; i <= n; ++i){
            //printf("(%hu %hu %hu ",V[i].a,V[i].b,V[i].c);
            Now = query(V[i].a - 1,V[i].b - 1) + 1;
            if (Now > Sol)
                Sol = Now;
            update(V[i].a,V[i].b,Now);
            //printf("%d )",Now);
        }
        printf("%hu\n",Sol);
    }
}