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
| #include<bits/stdc++.h> #define REG register using namespace std; inline void read(int& x){ REG char c; while(!isdigit(c=getchar()));x=c^48; while(isdigit(c=getchar()))x=(x*10)+(c^48); }
const int N=100005,K=300005,INF=0x7f7f7f7f;
int n,m,k;
struct Seg{int l,r,num;}seg[K]; inline bool cmp(Seg x,Seg y){return x.l>y.l;} int srt[K]; inline bool cmp1(int x,int y){return x>y;}
int Rt[K],tot; struct Tree{int ls,rs,val;}t[N*100];
void Build(int& now,int l,int r){ t[now=++tot].val=INF; if(l==r) return; REG int mid=(l+r)>>1; Build(t[now].ls,l,mid),Build(t[now].rs,mid+1,r); }
void Insert(int pre,int& now,int l,int r,int pos,int S){ t[now=++tot]=t[pre]; if(l==r) return (void)(t[now].val=min(t[now].val,S)); REG int mid=(l+r)>>1; if(mid>=pos) Insert(t[pre].ls,t[now].ls,l,mid,pos,S); else Insert(t[pre].rs,t[now].rs,mid+1,r,pos,S); t[now].val=max(t[t[now].ls].val,t[t[now].rs].val); }
int Ask(int now,int l,int r,int x,int y){ if(!now) return INF; if(l>=x&&r<=y) return t[now].val; REG int Ans=0,mid=(l+r)>>1; if(mid>=x) Ans=max(Ans,Ask(t[now].ls,l,mid,x,y)); if(mid<y) Ans=max(Ans,Ask(t[now].rs,mid+1,r,x,y)); return Ans; }
inline void Work(){ read(n),read(m),read(k); for(REG int i=1;i<=k;++i) read(seg[i].l),read(seg[i].r),read(seg[i].num),srt[i]=seg[i].l; sort(seg+1,seg+k+1,cmp),sort(srt+1,srt+k+1,cmp1); Build(Rt[0],1,n); for(REG int i=1;i<=k;++i) Insert(Rt[i-1],Rt[i],1,n,seg[i].num,seg[i].r); while(m--){ int a,b,x,y; read(a),read(b),read(x),read(y); int l=1,r=k,mid,ans=0; while(l<=r){ mid=(l+r)>>1; if(srt[mid]>=x) ans=mid,l=mid+1; else r=mid-1; } int M=Ask(Rt[ans],1,n,a,b); if(M<=y) puts("yes"); else puts("no"); fflush(stdout); } }
int main(){Work();}
|