记录编号 598156 评测结果 AAAAAAAAAA
题目名称 蝗灾 最终得分 100
用户昵称 Gravatarzxsoul 是否通过 通过
代码语言 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;
}