Pagini recente » Cod sursa (job #2714379) | Cod sursa (job #3141498) | Cod sursa (job #1115386) | Cod sursa (job #1479405) | Cod sursa (job #795003)
Cod sursa(job #795003)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
ofstream fout("cutii.out");
ifstream fin("cutii.in");
vector< pair< int , pair< int , int> > > cutii;
int t, n, ntree, tree[4000][4000];
int query(int x, int y)
{
int sum = 0;
for (int a=x; a >= 0; a = (a & (a + 1)) - 1)
for (int b=y; b >= 0; b = (b & (b + 1)) - 1)
sum = max(sum,tree[a][b]);
return sum;
}
// Increases value of k-th element by inc.
void set(int x, int y, int maxim)
{
for (int k = x; k <= ntree; k |= k + 1)
{
for (int kk=y; kk <= ntree; kk |= kk + 1)
tree[k][kk]= max(maxim, tree[k][kk] );
}
}
void unset(int x, int y)
{
for (int k = x; k <= ntree; k |= k + 1)
{
for (int kk=y; kk <= ntree; kk |= kk + 1)
tree[k][kk]=0;
}
}
int main()
{
fin >> n >> t;
ntree=n+1;
for (int tests=0; tests<t; tests++)
{
cutii.clear();
for (int i=0; i<n; i++)
{
int a,b,c;
fin >> a >> b >> c;
cutii.push_back( make_pair(a,make_pair(b,c)) );
}
sort(cutii.begin(),cutii.end());
int maximal =0;
int lastRem=0;
for (int i=0; i<n; i++)
{
if (i!=0)
if (cutii[i].first != cutii[i-1].first)
{
for (int j=lastRem; j<i; j++)
{
set(cutii[j].second.first , cutii[j].second.second,query(cutii[j].second.first-1,cutii[j].second.second-1)+1);
}
lastRem=i;
}
maximal = max(maximal,query(cutii[i].second.first-1,cutii[i].second.second-1));
}
for (int i=0; i<n; i++)
unset(cutii[i].second.first,cutii[i].second.second);
fout << maximal+1<<endl;
}
}