Cod sursa(job #1720542)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 22 iunie 2016 18:46:55
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
/// Salutari lui Ghigheci din partea lui Harry Potter
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 3505;

struct PII {
    int x, y;

    PII() { }
    PII(int _x, int _y) {
        x = _x;
        y = _y;
    }
};

int n;
int aib[NMAX][NMAX];
PII box[NMAX];

inline int lsb(int arg) {
    return arg&-arg;
}

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

int query(int x, int y) {
    int ans = 0;

    for(int i=x; i; i-=lsb(i))
    for(int j=y; j; j-=lsb(j))
        if(aib[i][j]>ans)
            ans = aib[i][j];

    return ans;
}

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

int main(void) {
    freopen("cutii.in", "r", stdin);
    freopen("cutii.out", "w", stdout);
    int t, g, ans, x, y, z;

    scanf("%d%d",&n,&t);
    while(t--) {
        ans = 1;

        for(int i=1; i<=n; ++i) {
            scanf("%d%d%d",&x,&y,&z);
            box[x] = PII(y, z);
        }
        for(int i=1; i<=n; ++i) {
            g   = query(box[i].x-1, box[i].y-1) + 1;
            ans = max(ans, g);
            update(box[i].x, box[i].y, g);
        }
        for(int i=1; i<=n; ++i)
            setnul(box[i].x, box[i].y);

        printf("%d\n",ans);
    }

    fclose(stdin);
    fclose(stdout);
    return 0;
}