#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <set> #include <vector> #include <map> #include <queue> #include <set> #include <algorithm> #include <limits> using namespace std; typedef long long LL; const int MAXN=100000+5; const int INF = numeric_limits<int>::max(); const LL LL_INF= numeric_limits<LL>::max(); #define lson L,mid,rt<<1 #define rson mid+1,R,rt<<1|1 struct Tree { LL cnt; int flag; int v; }tr[MAXN<<4]; int id[MAXN*4]; void pushup(int rt){ tr[rt].cnt=tr[rt<<1].cnt+tr[rt<<1|1].cnt; } void pushdownA(int L,int R,int rt); void pushdownB(int L,int R,int rt); void pushdownA(int L,int R,int rt){ if(L==R)return ; int mid=(L+R)>>1; if(tr[rt].flag&1){ if(tr[rt<<1].flag&2)pushdownB(lson); if(tr[rt<<1|1].flag&2)pushdownB(rson); tr[rt<<1].v+=tr[rt].v; tr[rt<<1|1].v+=tr[rt].v; tr[rt<<1].cnt+=(LL)tr[rt].v*(id[mid+1]-id[L]); tr[rt<<1|1].cnt+=(LL)tr[rt].v*(id[R+1]-id[mid+1]); tr[rt<<1].flag=tr[rt<<1|1].flag=1; tr[rt].flag=0; tr[rt].v=0; } pushdownB(L,R,rt); } void pushdownB(int L,int R,int rt){ if(L==R)return ; if(tr[rt].flag&2){ tr[rt<<1].v=tr[rt<<1|1].v=0; tr[rt<<1].cnt=tr[rt<<1|1].cnt=0; tr[rt<<1].flag=tr[rt<<1|1].flag=2; tr[rt].flag=0; tr[rt].v=tr[rt].cnt=0; } } void build(int L,int R,int rt){ tr[rt].v=tr[rt].flag=tr[rt].cnt=0; if(L==R)return ; int mid=(L+R)>>1; build(lson);build(rson); } void update(int L,int R,int rt,int l,int r,int v,int flag){ if(l<=L&&R<=r){ if(flag==1){ if(tr[rt].flag&2)pushdownB(L,R,rt); tr[rt].v+=v; tr[rt].cnt+=(LL)(id[R+1]-id[L])*v; tr[rt].flag=1; } if(flag==2){ tr[rt].v=0; tr[rt].cnt=0; tr[rt].flag=2; } return ; } pushdownA(L,R,rt); int mid=(L+R)>>1; if(l<=mid)update(lson,l,r,v,flag); if(r>mid)update(rson,l,r,v,flag); pushup(rt); } LL query(int L,int R,int rt,int l,int r){ if(l<=L&&R<=r)return tr[rt].cnt; pushdownA(L,R,rt); int mid=(L+R)>>1; LL ans=0; if(l<=mid)ans+=query(lson,l,r); if(r>mid)ans+=query(rson,l,r); pushup(rt); return ans; } struct node { int l,r,lid,rid; }a[MAXN]; struct node1 { int l,r,lid,rid,h,id; }b[MAXN]; int cmp(const node1 &x,const node1 &y){ return x.h>y.h; } int n,m; LL ans[MAXN]; int main() { while(~scanf("%d%d",&n,&m)){ id[0]=0; for(int i=0;i<n;i++){ scanf("%d%d",&a[i].l,&a[i].r); id[++id[0]]=a[i].l; id[++id[0]]=a[i].r; } for(int i=0;i<m;i++){ scanf("%d%d%d",&b[i].l,&b[i].r,&b[i].h); b[i].id=i; id[++id[0]]=b[i].l; id[++id[0]]=b[i].r; } sort(b,b+m,cmp); sort(id+1,id+1+id[0]); id[0]=unique(id+1,id+1+id[0])-id-1; for(int i=0;i<n;i++){ a[i].lid=lower_bound(id+1,id+1+id[0],a[i].l)-id; a[i].rid=lower_bound(id+1,id+1+id[0],a[i].r)-id; } for(int i=0;i<m;i++){ b[i].lid=lower_bound(id+1,id+id[0]+1,b[i].l)-id; b[i].rid=lower_bound(id+1,id+id[0]+1,b[i].r)-id; } build(1,id[0],1); for(int i=0;i<n;i++){ update(1,id[0],1,a[i].lid,a[i].rid-1,1,1); } for(int i=0;i<m;i++){ ans[b[i].id]=query(1,id[0],1,b[i].lid,b[i].rid-1); update(1,id[0],1,b[i].lid,b[i].rid-1,0,2); } for(int i=0;i<m;i++){ printf("%lld\n",ans[i]); } puts(""); } return 0; }
|