Cod sursa(job #2046716)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 24 octombrie 2017 01:23:33
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("cutii.in");
ofstream out("cutii.out");
struct str{
    int x,y,z;
}c[3501];
short aib[3501][3501];
short n,t;
bool cmp (str s1, str s2) {
    return s1.z < s2.z;
}
void update_aib (int pozitie_i, int pozitie_j, short valoare) {
    for (int i = pozitie_i; i <= n; i += (i&(-i))) {
        for (int j = pozitie_j; j <= n; j += (j&(-j))) {
            aib[i][j] = max (aib[i][j], valoare);
        }
    }
    return;
}
void reset_aib (int pozitie_i, int pozitie_j, short valoare) {
    for (int i = pozitie_i; i <= n; i += (i&(-i))) {
        for (int j = pozitie_j; j <= n; j += (j&(-j))) {
            aib[i][j] = valoare;
        }
    }
    return;
}
int query_aib (int pozitie_i, int pozitie_j) {
    short maxim = 0;
    for (int i = pozitie_i; i >= 1; i -= (i&(-i))) {
        for (int j = pozitie_j; j >= 1; j -= (j&(-j))) {
            maxim = max (maxim, aib[i][j]);
        }
    }
    return maxim;
}
int main(void) {
    in >>n >>t;
    for (int g = 1; g <= t; g ++) {
        for (int i = 1; i <= n; i ++) {
            in >> c[i].x >> c[i].y >> c[i].z;
        }
        sort (c + 1, c + n + 1, cmp);
        for (int i = 1; i <= n; i ++) {
            int x = query_aib(c[i].x-1,c[i].y-1);
            update_aib(  c[i].x, c[i].y, x + 1);
        }
        out << query_aib(n,n)<<"\n";
        for (int i = 1; i <= n; i ++) {
            reset_aib(c[i].x,c[i].y,0);
        }
    }
    return 0;
}