Cod sursa(job #2323856)

Utilizator patcasrarespatcas rares danut patcasrares Data 19 ianuarie 2019 20:44:20
Problema Cutii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<iostream>
#include<fstream>
#include<unordered_map>
#include<set>
#include<algorithm>
#include<ctime>
#define x first
#define y second
using namespace std;
ifstream fin("cutii.in");
ofstream fout("cutii.out");
const int DN=3505;
int n,t,st,dr,mij,ma,f,g,l;
pair<int,pair<int,int> >a[DN];
set<pair<int,int> >s[DN];
int vf(int lung)
{
	if(lung==0)
		return 1;
	if(s[lung].empty())
		return 0;
	set<pair<int,int> >::iterator it;
	it=s[lung].lower_bound({f,5000});
	if(it==s[lung].begin())
		return 0;
	it--;
	if(it->y<g)
		return 1;
	return 0;
}
void add(int lung)
{
	set<pair<int,int> >::iterator it;
	it=s[lung].lower_bound({f,5000});
	if(it!=s[lung].begin())
	{
		it--;
		if(it->y<g)
			return;
		it++;
	}
	int vf=1;
	while(vf)
	{
		vf=0;
		it=s[lung].lower_bound({f,5000});
		if(it==s[lung].end())
			break;
		if(g<it->y)
		{
			vf=1;
			s[lung].erase(it);
		}
	}
	s[lung].insert({f,g});
}
int main()
{
	fin>>n>>t;
	while(t--)
	{
		for(int i=1;i<=n;i++)
			s[i].clear();
		for(int i=1;i<=n;i++)
			fin>>a[i].x>>a[i].y.x>>a[i].y.y;
		sort(a+1,a+n+1);
		ma=0;
		for(int i=1;i<=n;i++)
		{
			f=a[i].y.x;
			g=a[i].y.y;
			st=0;
			dr=ma;
			while(st<dr)
			{
				mij=(st+dr+1)/2;
				if(vf(mij))
					st=mij;
				else
					dr=mij-1;
			}
			l=st+1;
			ma=max(ma,l);
			//cout<<l<<'\n';
			add(l);
		}
		fout<<ma<<'\n';
	}
}