最近(一直)有点(很)蠢
按照区间大小排序做区间包含多少区间的话
只用考虑 左端点比当前左端点小的和右端点比当前右端点大的,因为不可能同时满足
关于K,就在做到K的时候减一下就好了,一直傻逼在这了
#include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=(a),i##_end=(b);i<=i##_end;++i) #define For(i,a,b) for(int i=(a),i##_end=(b);i<i##_end;++i) #define per(i,a,b) for(int i=(b),i##_st=(a);i>=i##_st;--i) #define fi first #define se second #define pb push_back #define mp make_pair #define dbg(x) cerr<<#x" = "<<x<<endl #define debug(...) fprintf(stderr, __VA_ARGS__) #define Es(x,i) for(Edge *i=G[x];i;i=i->nxt) typedef long long ll; typedef pair<int,int> pii; const int inf=~0u>>1,MOD=1e9+7; char *TT,*mo,but[(1<<15)+2]; #define getchar() ((TT==mo&&(mo=((TT=but)+fread(but,1,1<<15,stdin)),TT==mo))?-1:*TT++) inline int rd() { int x,c,f=1;while(!isdigit(c=getchar()))f=c!=‘-‘;x=c-‘0‘; while(isdigit(c=getchar()))x=x*10+c-‘0‘;return f?x:-x; } const int N=5e5+11; struct Q{int l,r,id,f;}; int n,q; int ans[N]; int c[N],d[N]; inline void add(int*x,int y){for(;y<=n;y+=y&-y)++x[y];} inline int ask(int*x,int y){int r=0;for(;y;y^=y&-y)r+=x[y];return r;} vector<pii> a[N]; vector<Q> b[N]; int main(){ #ifdef flukehn freopen("test.txt","r",stdin); #endif n=rd(),q=rd(); rep(i,1,n){ int l=rd(),r=rd(); a[r-l+1].pb(mp(l,r)); } int tc=0; rep(i,1,q){ int l=rd(),r=rd(),K=rd(); if(r-l>=K){ b[K].pb((Q){l,r,i,-1}); b[r-l+1].pb((Q){l,r,i,1}); } } int cnt=0; rep(i,1,n){ for(vector<pii>::iterator it=a[i].begin();it!=a[i].end();++it){ add(c,it->fi),add(d,n-it->se+1); ++cnt; } for(vector<Q>::iterator it=b[i].begin();it!=b[i].end();++it){ ans[it->id]+=it->f*(cnt-ask(c,it->l-1)-ask(d,n-it->r)); } } rep(i,1,q)printf("%d\n",ans[i]); }