Pagini recente » Cod sursa (job #2079090) | Cod sursa (job #1998930) | Cod sursa (job #1363643) | Cod sursa (job #1874462) | Cod sursa (job #1799470)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
ifstream f ("cutii.in");
ofstream t ("cutii.out");
struct cutii{
int x;
int y;
int z;};
int n,q[100010];
volatile int nr,nr_aux;
vector <cutii> v;
cutii aux[100010];
int bin_search_y(cutii target)
{
int st=1,dr=nr;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(target.y<=v[q[mid]].y) dr=mid-1;
else st=mid+1;
}
return st;
}
int bin_search_z(cutii target)
{
int st=1,dr=nr_aux;
while(st<=dr)
{
int mid=(st+dr)>>1;
if(target.z>=aux[q[mid]].z) dr=mid-1;
else st=mid+1;
}
return st;
}
void scmax_y(){
memset(q,0,sizeof(q));
int d[100010],tata[100010];
for(int i=1;i<=n;++i){
int pos=bin_search_y(v[i]);
if(pos>nr) ++nr;
q[pos]=i;
d[i]=d[q[pos-1]]+1;
tata[i]=q[pos-1];
}
int max=0,pos;nr=0;
for(int i=1;i<=n;++i)
if(d[i]>max) max=d[i],pos=i;
for(int i=pos;i>0;i=tata[i])
aux[++nr]=v[i];
}
void scmax_z(){
memset(q,0,sizeof(q));
int d[100010],tata[100010];
for(int i=1;i<=nr;++i){
int pos=bin_search_z(aux[i]);
if(pos>nr_aux) ++nr_aux;
q[pos]=i;
d[i]=d[q[pos-1]]+1;
tata[i]=q[pos-1];
}
int max=0,pos;nr_aux=0;
for(int i=1;i<=nr;++i)
if(d[i]>max) max=d[i],pos=i;
for(int i=pos;i>0;i=tata[i])
++nr_aux;
cout<<nr_aux<<'\n';
}
void citire(){
int queries;
f>>n>>queries;
v.resize(n+1);
for (int i=0;i<queries;++i){
for (int j=1;j<=n;++j)
f>>v[j].x>>v[j].y>>v[j].z;
sort(v.begin()+1,v.end(),[](const cutii & a ,const cutii & b){return a.x < b.x;});
nr=nr_aux=0;
scmax_y();
scmax_z();
}
}
int main()
{
citire();
return 0;
}