Cod sursa(job #2957576)

Utilizator divadddDavid Curca divaddd Data 22 decembrie 2022 21:48:53
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define MAX 3502
using namespace std;
int t,n,dp[MAX];
int aib[MAX][MAX];

ifstream fin("cutii.in");
ofstream fout("cutii.out");

struct cutie{
    int x,y,z;
} c[MAX];

bool cmp(cutie c1, cutie c2){
    return (c1.x < c2.x);
}

void update(int x, int y, int val){
    for(int i = x; i < MAX; i += (i&-i)){
        for(int j = y; j < MAX; j += (j&-j)){
            aib[i][j] = max(aib[i][j], val);
            if(val == -1){
                aib[i][j] = 0;
            }
        }
    }
}

int query(int x, int y){
    int ans = 0;
    for(int i = x; i > 0; i -= (i&-i)){
        for(int j = y; j > 0; j -= (j&-j)){
            ans = max(ans, aib[i][j]);
        }
    }
    return ans;
}

void solve(){
    for(int i = 1; i <= n; i++){
        fin >> c[i].x >> c[i].y >> c[i].z;
    }
    sort(c+1, c+n+1, cmp);
    int ans = 0;
    for(int i = 1; i <= n; i++){
        int t = query(c[i].y-1, c[i].z-1);
        dp[i] = t+1;
        if(dp[i] > ans){
            ans = dp[i];
        }
        update(c[i].y, c[i].z, dp[i]);
    }
    fout << ans << "\n";
    for(int i = 1; i <= n; i++){
        update(c[i].y, c[i].z, -1);
    }
}

int main()
{
    fin >> n >> t;
    while(t--){
        solve();
    }
    return 0;
}