记录编号 |
598156 |
评测结果 |
AAAAAAAAAA |
题目名称 |
蝗灾 |
最终得分 |
100 |
用户昵称 |
zxsoul |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.423 s |
提交时间 |
2025-01-15 21:34:34 |
内存使用 |
12.13 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
int read(){int x;scanf("%lld",&x);return x;}
const int B=2e6+10;
const int inf=0x3f3f3f3f;
int T;
int n;
int m;
struct node
{
int opt,xl,xr,yl,yr,k;
}a[B];
struct node2
{
int opt,x,yl,yr,val,id;
}p[B];
int cmp(node2 a,node2 b)
{
if(a.x==b.x) return a.opt<b.opt;
return a.x<b.x;
}
int tot;
int t[B];
int ans[B];
int lowbit(int x){return x&(-x);}
void modify(int x,int v) {for (int i=x;i<=n;i+=lowbit(i)) t[i]+=v;}
int query(int x){int res=0;for (int i=x;i;i-=lowbit(i)) res+=t[i];return res;}
int ask(int l,int r){return query(r)-query(l-1);}
void solve(int l,int r)
{
if (l==r) return;
tot=0;
int mid=l+r>>1;
for (int i=l;i<=mid;i++) if (a[i].opt==1) p[++tot]=(node2){a[i].opt,a[i].xl,a[i].yl,0,a[i].k,0};
for (int i=mid+1;i<=r;i++)
{
if (a[i].opt==2)
{
p[++tot]=(node2){a[i].opt,a[i].xl-1,a[i].yl,a[i].yr,0,i};
p[++tot]=(node2){a[i].opt+1,a[i].xr,a[i].yl,a[i].yr,0,i};
}
}
sort(p+1,p+1+tot,cmp);
for (int i=1;i<=tot;i++)
{
if (p[i].opt==1) modify(p[i].yl,p[i].val);
if (p[i].opt==2) ans[p[i].id]-=ask(p[i].yl,p[i].yr);
if (p[i].opt==3) ans[p[i].id]+=ask(p[i].yl,p[i].yr);
}
for (int i=1;i<=tot;i++) if (p[i].opt==1) modify(p[i].yl,-p[i].val);
solve(l,mid);
solve(mid+1,r);
}
void work()
{
cin>>n;
cin>>m;
for (int i=1;i<=m;i++)
{
a[i].opt=read();
if (a[i].opt==1)
{
a[i].xl=read();
a[i].yl=read();
a[i].k=read();
}
else
{
int xl=read(),yl=read(),xr=read(),yr=read();
a[i]={2,min(xl,xr),max(xl,xr),min(yl,yr),max(yl,yr),0};
}
}
solve(1,m);
for (int i=1;i<=m;i++)
{
if (a[i].opt==2) cout<<ans[i]<<"\n";
}
}
signed main()
{
freopen("locust.in","r",stdin);
freopen("locust.out","w",stdout);
T=1;
while (T--) work();
return 0;
}