BOSS - Ai là sếp
Tác giả: flashmt
Ngôn ngữ: C++
#include<iostream>
#include<algorithm>
#define fr(a,b,c) for(a=b;a<=c;a++)
#define frr(a,b,c) for(a=b;a>=c;a--)
#define maxn 33333
using namespace std;
struct rec{int l,h,s;};
struct rec2{int d,x;};
int n,pre[maxn],f[maxn],g[maxn],p[maxn],list[maxn],re[maxn],e[1000000],ok[maxn];
rec a[maxn];
rec2 b[maxn];
bool cmp(rec i,rec j){return i.h>j.h;}
bool cmp2(rec2 i,rec2 j){return i.x>j.x;}
void add(int s)
{
int i=s;
while (i<=n)
{
if (s>f[i]) f[i]=s;
else break;
i+=i&-i;
}
}
int get(int i)
{
int r=0;
while (i)
{
r=max(r,f[i]);
i-=i&-i;
}
return r;
}
void visit(int x)
{
int i;
re[x]=1;
fr(i,p[x]+1,p[x+1])
{
visit(list[i]);
re[x]+=re[list[i]];
}
}
int main()
{
int i,j,test,q;
cin >> test;
while (test--)
{
cin >> n >> q;
fr(i,1,n+1) p[i]=f[i]=ok[i]=0;
fr(i,1,n)
{
scanf("%d%d%d",&a[i].l,&a[i].s,&a[i].h);
b[i].x=a[i].s;
b[i].d=i;
}
sort(b+1,b+n+1,cmp2);
fr(i,1,n) a[b[i].d].s=i;
sort(a+1,a+n+1,cmp);
fr(i,1,n) g[a[i].s]=i, e[a[i].l]=i;
fr(i,1,n)
{
if (!ok[i])
{
add(a[i].s);
ok[i]=1;
j=i+1;
while (j<=n && a[j].h==a[i].h)
{
add(a[j].s);
ok[j++]=1;
}
}
pre[i]=g[get(a[i].s-1)];
p[pre[i]]++;
}
fr(i,2,n+1) p[i]+=p[i-1];
fr(i,2,n) list[p[pre[i]]--]=i;
visit(1);
while (q--)
{
scanf("%d",&j);
printf("%d %d\n",a[pre[e[j]]].l,re[e[j]]-1);
}
}
return 0;
}