rt,理论能过正解应该是 O(n) 空间,但被卡常,目前没发现过的,O(nn) 分段可以过,这很不合理,建议缩小空间卡掉 O(n) 空间,实测可以开 256mb,然后开大时限,暂时不知道开大到多少,我的代码加上指令集卡评测机波动只能 460000 组询问。
然后帮帮孩子吧,真的卡不动了……
帮我卡常我什么都会做的 qwq
因为卡常码风十分奇怪。
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
#include <immintrin.h>
#include <emmintrin.h>
#include<bits/stdc++.h>
//#define int long long
using namespace std;
namespace fast_IO {
#define IOSIZE 1000000
char ibuf[IOSIZE],obuf[IOSIZE],*p1=ibuf,*p2=ibuf,*p3=obuf;
#ifdef ONLINE_JUDGE
#define getchar() ((p1==p2)and(p2=(p1=ibuf)+fread(ibuf,1,IOSIZE,stdin),p1==p2)?(EOF):(*p1++))
#define putchar(x) ((p3==obuf+IOSIZE)&&(fwrite(obuf,p3-obuf,1,stdout),p3=obuf),*p3++=x)
#define isdigit(ch) (ch>47&&ch<58)
#define isspace(ch) (ch<33)
#endif
template<typename T>inline T read(){T s=0;int w=1;char ch;while(ch=getchar(),!isdigit(ch)&&(ch!=EOF))if(ch==45)w=-1;if(ch==EOF)return 0;while(isdigit(ch))s=s*10+ch-48,ch=getchar();return s*w;}template<typename T>inline bool read(T&s){s=0;int w=1;char ch;while(ch=getchar(),!isdigit(ch)&&(ch!=EOF))if(ch==45)w=-1;if(ch==EOF)return 0;while(isdigit(ch))s=s*10+ch-48,ch=getchar();return s*=w,1;}inline bool read(char&s){while(s=getchar(),isspace(s));return 1;}inline bool read(char*s){char ch;while(ch=getchar(),isspace(ch));if(ch==EOF)return 0;while(!isspace(ch))*s++=ch,ch=getchar();*s='\000';return 1;}template<typename T>inline void print(T x){if(x<0)putchar(45),x=-x;if(x>9)print(x/10);putchar(x%10+48);}inline void print(char x){putchar(x);}inline void print(char*x){while(*x)putchar(*x++);}inline void print(const char*x){for(int i=0;x[i];i++)putchar(x[i]);}inline bool read(std::string&s){s="";char ch;while(ch=getchar(),isspace(ch));if(ch==EOF)return 0;while(!isspace(ch))s+=ch,ch=getchar();return 1;}inline void print(std::string x){for(int i=0,n=x.size();i<n;i++)putchar(x[i]);}inline bool read(bool&b){char ch;while(ch=getchar(),isspace(ch));b=ch^48;return 1;}inline void print(bool b){putchar(b+48);}inline bool read(double&x){int a=0,b=0;char ch=getchar();bool f=0;while(ch<48||ch>57){if(ch==45)f=1;ch=getchar();}while(47<ch&&ch<58){a=(a<<1)+(a<<3)+(ch^48);ch=getchar();}if(ch!=46){x=f?-a:a;return 1;}ch=getchar();while(47<ch&&ch<58){b=(b<<1)+(b<<3)+(ch^48),ch=getchar();}x=b;while(x>1)x/=10;x=f?-a-x:a+x;return 1;}template<typename T,typename...T1>inline int read(T& a,T1&...other){return read(a)+read(other...);}template<typename T,typename...T1>inline void print(T a,T1...other){print(a),print(other...);}struct Fast_IO{~Fast_IO(){fwrite(obuf,p3-obuf,1,stdout);}}io;template<typename T>Fast_IO& operator>>(Fast_IO&io,T&b){return read(b),io;}template<typename T>Fast_IO& operator<<(Fast_IO&io,T b){return print(b),io;}
#define cout io
#define cin io
#define endl '\n'
}using namespace fast_IO;
namespace TYX_YNXK{
#define il inline
#define bl bool
#define ll unsigned long long
#define vd void
#define N 500005
#define INF 0x7fffffff
#define pii pair<int,int>
#define pb push_back
#define MP make_pair
#define fi first
#define se second
#define DEBUG cout<<"You are right,but you are wrong"<<'\n'
#define END cout<<"You are right,but you are right now"<<'\n'
const int B=1200,SQ1=45,SQ2=1505;
int n,m,L[N],R[N],tbelong[N];
struct naive{
int x,y,z,id,a;ll b;
bl operator<(const naive& b)const{return z!=b.z?z<b.z:id<b.id;}
}p[N];
int mpx[N],mpy[N];
struct que{
int x,y,z,w,id;
bl operator<(const que& b)const{return z!=b.z?z<b.z:id<b.id;}
}q[N],q1[N];
ll ans[N],tmp[N];
int vz[N],vx[N/B+5][SQ2],vy[N/B+5][SQ2],znxt[N],xnxt[N],ynxt[N];
#define F1(i,x) for(register int i=1;i<Two_Way_Kuai_belong3[x];++i)
#define F2(i,x) for(register int i=Two_Way_Kuai_L3[Two_Way_Kuai_belong3[x]];i<Two_Way_Kuai_belong2[x];++i)
#define F3(i,x) for(register int i=Two_Way_Kuai_TL2[Two_Way_Kuai_belong2[x]];i<=x;++i)
#define F4(i,x) for(register int i=Two_Way_Kuai_belong3[n];i>Two_Way_Kuai_belong3[x];--i)
#define F5(i,x) for(register int i=Two_Way_Kuai_R3[Two_Way_Kuai_belong3[x]];i>Two_Way_Kuai_belong2[x];--i)
#define F6(i,x,n) for(register int i=belong[n];i>belong[x];--i)
#define F7(i,x) for(register int i=Furina_R[belong[x]];i>=x;--i)
#define be2 Two_Way_Kuai_belong2
#define L2 Two_Way_Kuai_TL2
#define R2 Two_Way_Kuai_TR2
inline void Add(__m512i *b,register int l,register int r,ll k) {
__m512i tmp = _mm512_set1_epi64(k);
register int x = l>>3, y = r>>3;
if(x == y) {
for(register int i=l; i<=r; ++i) b[i>>3][i&7] += k;
} else {
for(register int i=(y<<3); i<=r; ++i) b[i>>3][i&7] += k;
for(register int i=x+1; i<=y-1; ++i) b[i] = _mm512_add_epi64(b[i], tmp);
for(register int i=(x<<3)+7; i>=l; --i) b[i>>3][i&7] += k;
}
}
inline ll Query(__m512i *b, register int l, register int r) {
__m512i tmp = _mm512_set1_epi64(0);
ll res = 0;
register int x = l>>3, y = r>>3;
if(x == y) {
for(register int i=l; i<=r; ++i) res += b[i>>3][i&7];
} else {
for(register int i=(y<<3); i<=r; ++i) res += b[i>>3][i&7];
for(register int i=x+1; i<=y-1; ++i) tmp = _mm512_add_epi64(b[i], tmp);
for(register int i=(x<<3)+7; i>=l; --i) res += b[i>>3][i&7];
res += tmp[0] + tmp[1] + tmp[2] + tmp[3] + tmp[4] + tmp[5] + tmp[6] + tmp[7];
}
return res;
}
int Two_Way_Kuai_belong2[N],Two_Way_Kuai_belong3[N],Two_Way_Kuai_TL2[N],Two_Way_Kuai_TR2[N],Two_Way_Kuai_L3[N],Two_Way_Kuai_R3[N];
ll Two_Way_Kuai_c5[N];
__m512i Two_Way_Kuai_c1[SQ1][SQ1>>3],Two_Way_Kuai_c2[SQ2][SQ1>>3],Two_Way_Kuai_c3[SQ1][SQ2>>3],Two_Way_Kuai_c4[SQ2][SQ2>>3];
vector<int> in[SQ2][SQ2];
il vd Two_Way_Kuai_init(){
for(register int i=1;i<=n;++i) Two_Way_Kuai_belong2[i]=((i-1)>>10)+1,Two_Way_Kuai_belong3[i]=((i-1)>>15)+1,R2[Two_Way_Kuai_belong2[i]]=i,Two_Way_Kuai_R3[Two_Way_Kuai_belong3[i]]=Two_Way_Kuai_belong2[i];
for(register int i=n;i>=1;--i) L2[Two_Way_Kuai_belong2[i]]=i,Two_Way_Kuai_L3[Two_Way_Kuai_belong3[i]]=Two_Way_Kuai_belong2[i];
for(register int i=1;i<=n;++i) in[Two_Way_Kuai_belong2[i]][Two_Way_Kuai_belong2[mpx[i]]].pb(i);
}
il vd Two_Way_Kuai_clear(){
for(register int i=1;i<=Two_Way_Kuai_belong3[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong3[n]>>3;++j) Two_Way_Kuai_c1[i][j]=_mm512_set1_epi64(0);
for(register int i=1;i<=Two_Way_Kuai_belong2[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong3[n]>>3;++j) Two_Way_Kuai_c2[i][j]=_mm512_set1_epi64(0);
for(register int i=1;i<=Two_Way_Kuai_belong3[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong2[n]>>3;++j) Two_Way_Kuai_c3[i][j]=_mm512_set1_epi64(0);
for(register int i=1;i<=Two_Way_Kuai_belong2[n];++i) for(register int j=0;j<=Two_Way_Kuai_belong2[n]>>3;++j) Two_Way_Kuai_c4[i][j]=_mm512_set1_epi64(0);
for(register int i=1;i<=n;++i) Two_Way_Kuai_c5[i]=0;
}
il vd Two_Way_Kuai_update1(register int x,register int y,register int v){
F1(i,x) Add(Two_Way_Kuai_c1[i],1,Two_Way_Kuai_belong3[y]-1,v);
F2(i,x) Add(Two_Way_Kuai_c2[i],1,Two_Way_Kuai_belong3[y]-1,v);
F1(i,x) Add(Two_Way_Kuai_c3[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1,v);
F2(i,x) Add(Two_Way_Kuai_c4[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1,v);
F3(i,x) if(mpx[i]<=y) Two_Way_Kuai_c5[i]+=v;
F3(i,y) if(mpy[i]<Two_Way_Kuai_TL2[Two_Way_Kuai_belong2[x]]) Two_Way_Kuai_c5[mpy[i]]+=v;
}
il ll Two_Way_Kuai_query1(register int x,register int y){
register int a=Two_Way_Kuai_belong3[x],b=Two_Way_Kuai_belong2[x],c=Two_Way_Kuai_belong3[y],d=Two_Way_Kuai_belong2[y];
return Two_Way_Kuai_c1[a][c>>3][c&7]+Two_Way_Kuai_c2[b][c>>3][c&7]+Two_Way_Kuai_c3[a][d>>3][d&7]+Two_Way_Kuai_c4[b][d>>3][d&7]+Two_Way_Kuai_c5[x];
}
il vd Two_Way_Kuai_update2(register int x,register int y,ll v){
register int a=Two_Way_Kuai_belong3[x],b=Two_Way_Kuai_belong2[x],c=Two_Way_Kuai_belong3[y],d=Two_Way_Kuai_belong2[y];
Two_Way_Kuai_c1[a][c>>3][c&7]+=v,Two_Way_Kuai_c2[b][c>>3][c&7]+=v,Two_Way_Kuai_c3[a][d>>3][d&7]+=v,Two_Way_Kuai_c4[b][d>>3][d&7]+=v,Two_Way_Kuai_c5[x]+=v;
}
il ll Two_Way_Kuai_query2(register int x,register int y){
ll res=0;
F1(i,x) res+=Query(Two_Way_Kuai_c1[i],1,Two_Way_Kuai_belong3[y]-1);
F2(i,x) res+=Query(Two_Way_Kuai_c2[i],1,Two_Way_Kuai_belong3[y]-1);
F1(i,x) res+=Query(Two_Way_Kuai_c3[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1);
F2(i,x) res+=Query(Two_Way_Kuai_c4[i],Two_Way_Kuai_L3[Two_Way_Kuai_belong3[y]],Two_Way_Kuai_belong2[y]-1);
F3(i,x) if(mpx[i]<=y) res+=Two_Way_Kuai_c5[i];
F3(i,y) if(mpy[i]<Two_Way_Kuai_TL2[Two_Way_Kuai_belong2[x]]) res+=Two_Way_Kuai_c5[mpy[i]];
return res;
}
il vd Two_Way_Kuai_update3(register int x,register int y,register int v){
F4(i,x) Add(Two_Way_Kuai_c1[i],Two_Way_Kuai_belong3[y]+1,Two_Way_Kuai_belong3[n],v);
F5(i,x) Add(Two_Way_Kuai_c2[i],Two_Way_Kuai_belong3[y]+1,Two_Way_Kuai_belong3[n],v);
F4(i,x) Add(Two_Way_Kuai_c3[i],Two_Way_Kuai_belong2[y]+1,Two_Way_Kuai_R3[Two_Way_Kuai_belong3[y]],v);
F5(i,x) Add(Two_Way_Kuai_c4[i],Two_Way_Kuai_belong2[y]+1,Two_Way_Kuai_R3[Two_Way_Kuai_belong3[y]],v);
Two_Way_Kuai_c5[x]+=v;
}
il ll Two_Way_Kuai_query3(register int x,register int y){
register int a=Two_Way_Kuai_belong3[x],b=Two_Way_Kuai_belong2[x],c=Two_Way_Kuai_belong3[y],d=Two_Way_Kuai_belong2[y];
ll res=Two_Way_Kuai_c1[a][c>>3][c&7]+Two_Way_Kuai_c2[b][c>>3][c&7]+Two_Way_Kuai_c3[a][d>>3][d&7]+Two_Way_Kuai_c4[b][d>>3][d&7];
for(vector<int>::iterator it=in[b][d].begin();it!=in[b][d].end();++it) if(*it<=x&&mpx[*it]<=y) res+=Two_Way_Kuai_c5[*it];
return res;
}
int Furina_n,Furina_m;
ll c1[SQ1][SQ1],c2[SQ2][SQ1],c3[SQ1][SQ2],c4[SQ2][SQ2];
int belong[N],Furina_R[N];
il vd init(){
for(register int i=1;i<=n;++i) belong[i]=((i-1)>>5)+1,Furina_R[belong[i]]=i;
}
il vd clear(){
for(register int i=1;i<=belong[Furina_n];++i) for(register int j=1;j<=belong[Furina_m];++j) c1[i][j]=0;
for(register int i=1;i<=Furina_n;++i) for(register int j=1;j<=belong[Furina_m];++j) c2[i][j]=0;
for(register int i=1;i<=belong[Furina_n];++i) for(register int j=1;j<=Furina_m;++j) c3[i][j]=0;
for(register int i=1;i<=Furina_n;++i) for(register int j=1;j<=Furina_m;++j) c4[i][j]=0;
}
il vd update4(register int x,register int y,register int v){
F6(i,x,Furina_n) F6(j,y,Furina_m) c1[i][j]+=v;
F7(i,x) F6(j,y,Furina_m) c2[i][j]+=v;
F6(i,x,Furina_n) F7(j,y) c3[i][j]+=v;
F7(i,x) F7(j,y) c4[i][j]+=v;
}
il ll query4(register int x,register int y){
if(!x||!y) return 0;
register int a=belong[x],c=belong[y];
return c1[a][c]+c2[x][c]+c3[a][y]+c4[x][y];
}
signed main(){
cin>>n>>m;m=min(m,460000);
for(register int i=1;i<=n;++i) cin>>p[i].x>>p[i].y>>p[i].z>>p[i].a,mpx[p[i].x]=p[i].y,mpy[p[i].y]=p[i].x,p[i].id=i;
sort(p+1,p+1+n);
for(register int i=1;i<=m;++i) cin>>q[i].x>>q[i].y>>q[i].z>>q[i].w,q[i].id=i,q1[i]=q[i];
sort(q1+1,q1+1+m);
Two_Way_Kuai_init();init();
for(register int tim=1,Tim=(m-1)/B+1;tim<=Tim;++tim){
L[tim]=(tim-1)*B+1,R[tim]=tim*B;if(tim==Tim) R[tim]=m;
for(register int i=L[tim];i<=R[tim];++i) tbelong[i]=tim;
if(tim!=1){
for(register int i=1,pos=1;i<=m;++i){
for(;pos<=n&&p[pos].z<=q1[i].z;++pos) if(p[pos].b) Two_Way_Kuai_update2(p[pos].x,p[pos].y,p[pos].b);
if(L[tim]<=q1[i].id&&q1[i].id<=R[tim]) ans[q1[i].id]+=Two_Way_Kuai_query2(q1[i].x,q1[i].y);
}
Two_Way_Kuai_clear();
}
for(register int i=n,pos=m;i>=1;--i){
for(;q1[pos].z>=p[i].z;--pos) if(pos&&L[tim]<=q1[pos].id&&q1[pos].id<=R[tim]&&q1[pos].w) Two_Way_Kuai_update1(q1[pos].x,q1[pos].y,q1[pos].w);
p[i].b+=Two_Way_Kuai_query1(p[i].x,p[i].y)*p[i].a;
}
Two_Way_Kuai_clear();
}
for(register int i=1;i<=m;++i) znxt[i]=vz[q[i].z],vz[q[i].z]=i;
for(register int i=1;i<=n;++i){
Two_Way_Kuai_update3(p[i].x,p[i].y,p[i].a);
for(register int it=vz[i];it;it=znxt[it]){
register int I=it,tim=tbelong[I];
for(register int j=L[tim];j<I;++j) if(q[j].z>q[I].z&&q[j].w) ans[I]+=Two_Way_Kuai_query3(min(q[j].x,q[I].x),min(q[j].y,q[I].y))*q[j].w;
if(q[I].w) for(register int j=I+1;j<=R[tim];++j) if(q[j].z>=q[I].z) ans[j]+=Two_Way_Kuai_query3(min(q[j].x,q[I].x),min(q[j].y,q[I].y))*q[I].w;
}
}
for(register int i=1;i<=m;++i) xnxt[i]=vx[(i-1)/B+1][be2[q[i].x]],ynxt[i]=vy[(i-1)/B+1][be2[q[i].y]],vx[(i-1)/B+1][be2[q[i].x]]=vy[(i-1)/B+1][be2[q[i].y]]=i;
for(register int Be=1;Be<=be2[n];++Be){
Furina_n=R2[Be]-L2[Be]+1,Furina_m=be2[n];
clear();
for(register int i=1,pos=1;i<=m;++i){
if(be2[q1[i].x]<Be) continue;
for(;pos<=n&&p[pos].z<=q1[i].z;++pos) if(be2[p[pos].x]==Be) update4(p[pos].x-L2[Be]+1,be2[p[pos].y],p[pos].a);
register int I=q1[i].id,tim=tbelong[I];
if(be2[q1[i].x]==Be){
for(register int j=L[tim];j<I;++j) if(be2[q[j].x]>=Be&&q[j].w&&q[I].z<=q[j].z) ans[I]+=query4(min(q[I].x,q[j].x)-L2[Be]+1,be2[min(q[I].y,q[j].y)]-1)*q[j].w;
if(q[I].w) for(register int j=I+1;j<=R[tim];++j) if(be2[q[j].x]>=Be&&(q[I].z<q[j].z||(q[I].z==q[j].z&&be2[q[j].x]>Be))) ans[j]+=query4(min(q[I].x,q[j].x)-L2[Be]+1,be2[min(q[I].y,q[j].y)]-1)*q[I].w;
}else{
for(register int it=vx[tim][Be];it;it=xnxt[it]){
register int j=it;
if(q[min(j,I)].w&&q[I].z<q[j].z) ans[max(j,I)]+=query4(q[j].x-L2[Be]+1,be2[min(q[I].y,q[j].y)]-1)*q[min(j,I)].w;
}
}
}
}
for(register int Be=1;Be<=be2[n];++Be){
Furina_m=R2[Be]-L2[Be]+1,Furina_n=be2[n];
clear();
for(register int i=1,pos=1;i<=m;++i){
if(be2[q1[i].y]<Be) continue;
for(;pos<=n&&p[pos].z<=q1[i].z;++pos) if(be2[p[pos].y]==Be) update4(be2[p[pos].x],p[pos].y-L2[Be]+1,p[pos].a);
register int I=q1[i].id,tim=tbelong[I];
if(be2[q1[i].y]==Be){
for(register int j=L[tim];j<I;++j) if(be2[q[j].y]>=Be&&q[j].w&&q[I].z<=q[j].z) ans[I]+=query4(be2[min(q[I].x,q[j].x)]-1,min(q[I].y,q[j].y)-L2[Be]+1)*q[j].w;
if(q[I].w) for(register int j=I+1;j<=R[tim];++j) if(be2[q[j].y]>=Be&&(q[I].z<q[j].z||(q[I].z==q[j].z&&be2[q[j].y]>Be))) ans[j]+=query4(be2[min(q[I].x,q[j].x)]-1,min(q[I].y,q[j].y)-L2[Be]+1)*q[I].w;
}else{
for(register int it=vy[tim][Be];it;it=ynxt[it]){
register int j=it;
if(q[min(j,I)].w&&q[I].z<q[j].z) ans[max(j,I)]+=query4(be2[min(q[I].x,q[j].x)]-1,q[j].y-L2[Be]+1)*q[min(j,I)].w;
}
}
}
}
for(register int i=1;i<=m;++i) cout<<ans[i]<<'\n';
return 0;
}
}
signed main(){
TYX_YNXK::main();
return 0;
}