n
个岛,看做线段
将所有相邻两岛的架桥长度范围按右端点第一关键字从小到大排序,左端点第二关键字从小到大排序,贪心,每次尽量找长度最短的桥架桥。
/// by ztx
#include <cstdio>
#define Rep(i,l,r) for(i=(l);i<=(r);i++)
#define rep(i,l,r) for(i=(l);i< (r);i++)
typedef long long ll ;
int CH;
template <typename TP>inline void read(TP& ret) {
ret = 0 ; while (CH=getchar() , CH<'!') ;
while (ret = ret*10+CH-'0' , CH=getchar() , CH>'!') ;
}
#include <algorithm>
#include <set>
#define maxn 200010LL
struct Seg {
ll l, r; int id;
bool operator < (const Seg&B) const { return r==B.r ? l<B.l : r<B.r; }
} s[maxn];
struct Bri {
ll len; int id;
bool operator < (const Bri&B) const { return len==B.len ? id<B.id : len<B.len; }
/// std::set cannot has same value !!
};
std::set<Bri> S;
std::set<Bri>::iterator it;
int ans[maxn];
int main() {
int n, m, i;
ll l0, r0, l, r;
read(n), read(m), read(l0), read(r0);
rep (i,1,n) {
read(l), read(r);
s[i].id = i, s[i].l = l-r0, s[i].r = r-l0, l0 = l, r0 = r;
}
Rep (i,1,m) read(l), S.insert((Bri){l,i});
std::sort(s+1,s+n);
rep (i,1,n) {
it = S.lower_bound((Bri){s[i].l,0});
if (it==S.end() || it->len>s[i].r) goto NO;
ans[s[i].id] = it->id, S.erase(it);
}
puts("Yes");
rep (i,1,n) printf("%d ", ans[i]);
goto END;
NO:;
puts("No");
END:;
return 0;
}