这扫描线敢不敢再水一点
好像没法更水了
Code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline ll read(){
ll res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
const int N=8e5+5;
int cnt;
namespace Bit{
ll tr[N];
inline int lb(int x){return x&(-x);}
inline void add(int x,ll v){for(int i=x;i<=cnt;i+=lb(i)) tr[i]+=v;}
inline ll ask(int x){ll res=0;for(int i=x;i;i-=lb(i)) res+=tr[i];return res;}
}
using namespace Bit;
struct point{
int x,y;ll val;
point(){}
point(int _x,int _y,ll _val):x(_x),y(_y),val(_val){}
inline bool operator < (const point &a)const{return x<a.x;}
}p[N];
struct Q{
int x,l,r,id;
Q(){}
Q(int _x,int _l,int _r,int _id):x(_x),l(_l),r(_r),id(_id){}
inline bool operator < (const Q &a)const{return x<a.x;}
}q[N];
int n,m;
int x[N],y[N];ll val[N];
int qx[N],qy[N],qx1[N],qy1[N];
int a[N],qcnt=0;
ll ans[N];
inline int get(int x){return lower_bound(a+1,a+cnt+1,x)-a;}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++){
x[i]=read(),y[i]=read();val[i]=read();
a[++cnt]=x[i];a[++cnt]=y[i];
}
for(int i=1;i<=m;i++){
qx[i]=read()-1,qy[i]=read()-1;qx1[i]=read(),qy1[i]=read();
a[++cnt]=qx[i];a[++cnt]=qy[i];a[++cnt]=qx1[i];a[++cnt]=qy1[i];
}
sort(a+1,a+cnt+1);cnt=unique(a+1,a+cnt+1)-a-1;
for(int i=1;i<=n;i++) p[i]=point(get(x[i]),get(y[i]),val[i]);
for(int i=1;i<=m;i++) q[++qcnt]=Q(get(qx[i]),get(qy[i]),get(qy1[i]),i),q[++qcnt]=Q(get(qx1[i]),get(qy[i]),get(qy1[i]),i);
sort(p+1,p+n+1);sort(q+1,q+qcnt+1);
int now=1;
for(int i=1;i<=qcnt;i++){
while(p[now].x<=q[i].x && now<=n) add(p[now].y,p[now].val),++now;
if(!ans[q[i].id]) ans[q[i].id]=ask(q[i].r)-ask(q[i].l);
else ans[q[i].id]=ask(q[i].r)-ask(q[i].l)-ans[q[i].id];
}
for(int i=1;i<=m;i++) cout<<ans[i]<<"\n";
return 0;
}