Cod sursa(job #2951453)

Utilizator Pop_EmilPal Tamas Pop_Emil Data 6 decembrie 2022 13:58:22
Problema Cutii Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.45 kb
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <set>
#include <bits/stdc++.h>
using namespace std;

FILE *in = fopen("cutii.in", "r"), *out = fopen("cutii.out", "w");

int N, T;
#define MaxN 3505
int v[3][MaxN];
int BIT[3][MaxN], origid[3][MaxN], lengths[3][MaxN], pre[3][MaxN];
vector<set<int>> idx_sets [3];

int query(int d, int pos){
    int i = pos, max_pos = 0;
    while(i){
        if (BIT[d][i] > BIT[d][max_pos])
            max_pos = i;
        i -= i & (-i);
    }
    return max_pos;
}

void update(int d, int nr, int length, int pos){
    int i = nr;
    while (i <= N){
        if (BIT[d][i] < length){
            BIT[d][i] = length;
            origid[d][i] = pos;
        }
        i += i & (-i);
    }
}

int main()
{
    fscanf(in, "%d %d", &N, &T);

    int max_pos;
    while(T--) {
        for(int i = 1; i <= N; ++i)
            fscanf(in, "%d %d %d", &v[0][i], &v[1][i], &v[2][i]);

        for(int d = 0; d < 3; ++d){
            memset(BIT, 0, sizeof(BIT));

            for(int i = 1; i <= N; ++i){
                max_pos = query(d, v[d][i] - 1);
                pre[d][i] = origid[d][max_pos];
                lengths[d][i] = BIT[d][max_pos] + 1;
                update(d, v[d][i], BIT[d][max_pos] + 1, i);
            }

            int max_len_pos = 0;
            for(int i = 1; i <= N; ++i)
                if (lengths[d][i] > lengths[d][max_len_pos])
                    max_len_pos = i;

            idx_sets[d].clear();
            for(int i = 1; i <= N; ++i)
                if (lengths[d][i] == lengths[d][max_len_pos]){
                    set<int> idxs;
                    for(int j = i; j; j = pre[d][j])
                        idxs.insert(j);
                    idx_sets[d].push_back(idxs);
                }
        }

        set<int> result;
        int max_size = 1;
        for(auto set1: idx_sets[0])
            for(auto set2: idx_sets[1])
                for(auto set3: idx_sets[2]){
                    std::set_intersection(set1.begin(), set1.end(), set2.begin(), set2.end(), std::inserter(result, result.begin()));
                    std::set_intersection(result.begin(), result.end(), set3.begin(), set3.end(), std::inserter(result, result.begin()));
                    if(result.size() > max_size)
                        max_size = result.size();
                }
        fprintf(out, "%d\n", max_size);
    }
    return 0;
}