Cod sursa(job #2093044)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 22 decembrie 2017 20:20:49
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
#define MAXN 3500
#define zeros(x) (x & (-x))

short aib[1 + MAXN][1 + MAXN];
char last[1 + MAXN][1 + MAXN];
int z;
void update(int x, int y, short val){
    for(int i = x; i <= MAXN; i += zeros(i))
        for(int j = y; j <= MAXN; j+= zeros(j)){
            if(last[i][j] != z)
                aib[i][j] = 0;
            last[i][j] = z;
            aib[i][j] = std::max(aib[i][j], val);
        }
}
short query(int x, int y){
    short ans = 0;
    for(int i= x; i > 0; i -= zeros(i))
        for(int j = y; j > 0; j -= zeros(j)){
            if(last[i][j] != z)
                aib[i][j] = 0;
            last[i][j] = z;
            ans = std::max(ans, aib[i][j]);
        }
    return ans;
}

struct Point{
    int x, y, z;
}v[1 + MAXN];

bool cmp(Point A, Point B){
    return A.z < B.z;
}

int main(){
    FILE*fi,*fo;
    fi=fopen("cutii.in","r");
    fo=fopen("cutii.out","w");

    int n, t;
    fscanf(fi,"%d%d", &n, &t);
    for(z = 1; z <= t; z++){
        for(int i = 1; i <= n; i++)
            fscanf(fi,"%d%d%d", &v[i].x, &v[i].y, &v[i].z);
        std::sort(v + 1, v + n + 1, cmp);
        for(int i = 1; i <= n; i++){
            int val = query(v[i].x, v[i].y);
            update(v[i].x, v[i].y, val + 1);
        }
        fprintf(fo,"%d\n", query(MAXN, MAXN));
    }

    fclose(fi);
    fclose(fo);
    return 0;
}