#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2000010;
struct data
{
int x,y,dir,pos,type,delta;
}event[N];
int n,size,w,s,m,pos,opt;
vector<data> c;
int tree[N],ans[N];
bool cp(data x,data y)
{
if(x.x!=y.x) return x.x<y.x;
if(x.y!=y.y) return x.y<y.y;
return x.type<y.type;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int pos,int delta)
{
for(int i=pos;i<=N+1;i+=lowbit(i))
{
tree[i]+=delta;
}
}
int sum(int pos)
{
int ret=0;
for(int i=pos;i>0;i-=lowbit(i))
{
ret+=tree[i];
}
return ret;
}
void cdq(int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2;
cdq(l,mid);
cdq(mid+1,r);
c.clear();
for(int i=l;i<=mid;i++)
if(event[i].type==1) c.push_back(event[i]);
for(int i=mid+1;i<=r;i++)
if(event[i].type==2) c.push_back(event[i]);
sort(c.begin(),c.end(),cp);
for(int i=0;i<c.size();i++)
{
// printf("type=%d pos=%d\n",c[i].type,c[i].pos);
if(c[i].type==1)
update(c[i].y,c[i].delta);
if(c[i].type==2)
{
ans[c[i].pos]+=sum(c[i].y)*c[i].dir;
// printf("%d\n",sum(c[i].y));
}
}
for(int i=0;i<c.size();i++)
if(c[i].type==1) update(c[i].y,-c[i].delta);
}
void addquery(int x,int y,int dir)
{
event[++m].x=x; event[m].y=y;
event[m].dir=dir; event[m].pos=pos;
event[m].type=2;
}
int main()
{
scanf("%d",&s);
while(scanf("%d",&opt))
{
if(opt==3) break;
int x,y,delta,x1,y1,x2,y2;
if(opt==1)
{
scanf("%d%d%d",&x,&y,&delta);
x++;
y++;
m++;
event[m].type=opt;
event[m].x=x;
event[m].y=y;
event[m].delta=delta;
}
else if(opt==2)
{
++pos;
//ans[++pos]+=abs(x1-x2)*abs(y1-y2)*s;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++; x2++; y1++; y2++;
addquery(x1-1,y1-1,1);
addquery(x2,y2,1);
addquery(x1-1,y2,-1);
addquery(x2,y1-1,-1);
}
}
cdq(1,m);
for(int i=1;i<=pos;i++)
{
printf("%d\n",ans[i]);
}
return 0;
}