Pagini recente » Cod sursa (job #581092) | Cod sursa (job #1318247) | Cod sursa (job #784914) | Monitorul de evaluare | Cod sursa (job #2951453)
#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;
}