把plays和actors的区间混合并按照l排序,相同则actors<plays
然后这段序列中已维护actors.l≤plays.l,actors.r>plays.r可以用set找
复杂度O((n+m)log(n+m))
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
#include<set>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (100000+10)
long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
int n,m;
struct Pair
{
public:
int l,r,i;
bool flag;
friend bool operator<(const Pair a,const Pair b){
return a.r<b.r;
}
}a[MAXN*2];
int k[MAXN];
int cmp(const void* a,const void *b)
{
Pair a2=*(Pair*)a;
Pair b2=*(Pair*)b;
if (a2.l^b2.l) return a2.l<b2.l?-1:1;
return a2.flag<b2.flag?-1:a2.flag==b2.flag?0:1;
}
multiset<Pair> S;
multiset<Pair>::iterator it;
int ans[MAXN];
int main()
{
// freopen("CF496E.in","r",stdin);
scanf("%d",&n);
For(i,n) scanf("%d%d",&a[i].l,&a[i].r),a[i].i=i,a[i].flag=1;
scanf("%d",&m);
Fork(i,n+1,n+m) scanf("%d%d%d",&a[i].l,&a[i].r,&k[i-n]),a[i].i=i-n,a[i].flag=0;
qsort(a+1,n+m,sizeof(a[1]),cmp);
S.clear();
For(i,n+m)
{
if (!a[i].flag) S.insert(a[i]);
else
{
it=S.lower_bound(a[i]);
if (it!=S.end())
{
ans[a[i].i]=it->i;
if (--k[it->i]==0) S.erase(it);
}
else
{
cout<<"NO\n";
return 0;
}
}
}
cout<<"YES\n";
printf("%d",ans[1]);Fork(i,2,n) printf(" %d",ans[i]);printf("\n");
return 0;
}