Cod sursa(job #1425475)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 27 aprilie 2015 15:56:51
Problema Cutii Scor 100
Compilator cpp Status done
Runda pregatire-lot-aib Marime 1.43 kb
#include<fstream>
#include<algorithm>
#include<cstring>
using namespace std;
int n, t, i, maxim;
int d[3502], a[3502][3502];
struct cutie{
    int x;
    int y;
    int z;
};
cutie v[3502];
ifstream fin("cutii.in");
ofstream fout("cutii.out");
int query(int x, int y){
    int maxim = 0;
    for(int i = x; i >= 1; i -= (i & -i)){
        for(int j = y; j >= 1; j -= (j & -j)){
            maxim = max(maxim, a[i][j]);
        }
    }
    return maxim;
}
void update(int x, int y, int val){
    for(int i = x; i <= n; i += (i & -i)){
        for(int j = y; j <= n; j += (j & -j)){
            a[i][j] = max(a[i][j], val);
        }
    }
}
void curata(int x, int y){
    for(int i = x; i <= n; i += (i & -i)){
        for(int j = y; j <= n; j += (j & -j)){
            a[i][j] = 0;
        }
    }
}
int cmp(cutie a, cutie b){
    return a.z < b.z;
}
int main(){
    fin>> n >> t;
    for(; t; t--){
        for(i = 1; i <= n; i++){
            fin>> v[i].x >> v[i].y >> v[i].z;
        }
        sort(v + 1, v + n + 1, cmp);
        d[1] = 1;
        maxim = 1;
        update(v[1].x, v[1].y, 1);
        for(i = 2; i <= n; i++){
            d[i] = query(v[i].x - 1, v[i].y - 1) + 1;
            update(v[i].x, v[i].y, d[i]);
            maxim = max(maxim, d[i]);
        }
        fout<< maxim <<"\n";
         for(i = 1; i <= n; i++){
            curata(v[i].x, v[i].y);
        }
    }
    return 0;
}