Pagini recente » Cod sursa (job #2278532) | Cod sursa (job #211599) | Cod sursa (job #2028036) | Cod sursa (job #2732816) | Cod sursa (job #794911)
Cod sursa(job #794911)
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
#include <cstdio>
#include <algorithm>
using namespace std;
//ifstream fin("cutii.in");
ofstream fout("cutii.out");
vector<int> adj[4000];
vector< pair< int , pair< int , int> > > cutii;
int cost[4000];
bool finished[4000];
int t;
int n;
int ntree;
int tree[4000][4000];
int query(int x, int y) {
//cout << "cer:" << x << "," << y<<endl;
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]);
//fout << "da:" << sum<<endl;
return sum;
}
// Increases value of k-th element by inc.
void set(int x, int y, int maxim) {
//cout << "bag:" << x << "," << y <<":"<<maxim<<endl;
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) {
//cout << "pe 0 :" << x << "," << y <<endl;
for (int k = x; k <= ntree; k |= k + 1)
{
for (int kk=y; kk <= ntree; kk |= kk + 1)
tree[k][kk]=0;
}
}
int main()
{
// gen
/*
ofstream finout("cutii.in");
finout << 3500 << " " <<100<<endl;
for (int i=0;i<100;i++)
for (int j=0;j<3500;j++)
{
finout << j/5 << " " << j%5 << " " << j<<endl;
}
finout.close();
*/
ifstream fin("cutii.in");
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)) );
}
//for (int i=0; i<n; i++)
// cout << "am : "<< cutii[i].second.first<<","<< cutii[i].second.second<<endl;
sort(cutii.begin(),cutii.end());
int maximal =0;
int lastRem=0;
for (int i=0; i<n; i++)
{
//cout << "am : "<< cutii[i].second.first<<","<< cutii[i].second.second<<endl;
if (i!=0)
if (cutii[i].first != cutii[i-1].first)
{
for (int j=lastRem;j<i;j++)
{
// set efectiv
set(cutii[j].second.first , cutii[j].second.second,query(cutii[j].second.first-1,cutii[j].second.second-1)+1);
}
lastRem=i;
}
maximal = query(cutii[i].second.first-1,cutii[i].second.second-1);
//cout << "gasit:" << query(cutii[i].second.first-1,cutii[i].second.second-1)<<endl;
}
for (int i=0; i<n; i++)
unset(cutii[i].second.first,cutii[i].second.second);
fout << maximal+1<<endl;
}
}