1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| const int N = 3e5+10,M = 4e5+10,INF = 0x3f3f3f3f; int n,m,C,T; int b[N+M*2],idx,R[N+M*2]; struct Query{ int l,r,k; }q[M]; struct Ed{ int u,v,c; }edge[N]; vector <int> ed[N+M*2]; int tr[N*4+M*8]; inline void build(int p,int nl,int nr){ if(nl==nr){ tr[p] = b[R[nl]]; return ; } int mid = (nl+nr) >> 1; build(p<<1,nl,mid); build(p<<1|1,mid+1,nr); tr[p] = Min(tr[p<<1],tr[p<<1|1]); } inline void update(int p,int nl,int nr,int x,int k){ if(nl==nr){ tr[p] += k; return ; } int mid = (nl+nr) >> 1; if(x<=mid) update(p<<1,nl,mid,x,k); else update(p<<1|1,mid+1,nr,x,k); tr[p] = Min(tr[p<<1],tr[p<<1|1]); } inline int query(int p,int nl,int nr,int ql,int qr){ if(ql>qr) return INF+INF; if(ql<=nl && nr<=qr) return tr[p]; int mid = (nl+nr) >> 1; int res = INF+INF; if(ql<=mid) res = Min(res,query(p<<1,nl,mid,ql,qr)); if(qr>mid) res = Min(res,query(p<<1|1,mid+1,nr,ql,qr)); return res; } int main(){ read(n,m,C); for(int i=1,u,v,c;i<=m;++i){ read(u,v,c); edge[i] = {u,v,c}; b[++idx] = c; } read(T); for(int i=1,l,r,k;i<=T;++i){ read(l,r,k); q[i] = {l,r,k}; b[++idx] = l; b[++idx] = Max(1,l-k); } sort(b+1,b+1+idx); idx = unique(b+1,b+1+idx)-(b+1); b[idx+1] = INF+INF; for(int i=1;i<=m;++i){ edge[i].c = lower_bound(b+1,b+1+idx,edge[i].c)-b; ed[edge[i].c].push_back(edge[i].v); } for(int i=1,now = 0;i<=idx;++i){ while(query(1,1,n,2,n)<=0 && now+1<=idx+1){ ++now; for(int j=(int)ed[now].size()-1;j>=0;--j){ update(1,1,n,ed[now][j],1); } } R[i] = now; for(int j=(int)ed[i].size()-1;j>=0;--j){ update(1,1,n,ed[i][j],-1); } } build(1,1,idx); for(int i=1,l,r;i<=T;++i){ l = lower_bound(b+1,b+1+idx,Max(1,q[i].l-q[i].k))-b; r = lower_bound(b+1,b+1+idx,q[i].l)-b; (query(1,1,idx,l,r)<=q[i].r-q[i].l+q[i].k) ? puts("Yes") : puts("No"); }
return 0; }
|