RT
加O2过了,不加连WA带T
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=17e4+5;
int cnt;
int n;
inline char gc()
{
static char BB[100000],*S=BB,*T=BB;
return S==T&&(T=(S=BB)+fread(BB,1,100000,stdin),S==T)?EOF:*S++;
}
int read() {
int x=0;
char ch=gc();
while(ch<'0'||ch>'9') ch=gc();
while(ch<='9'&&ch>='0') {
x=x*10+ch-48;
ch=gc();
}
return x;
}
struct node
{
int a,b,c;
int cnt;
int q;
};node a[N<<2];
bool cmp1(node x,node y)
{
if(x.a!=y.a) return x.a<y.a;
if(x.b!=y.b) return x.b<y.b;
if(x.c!=y.c) return x.c<y.c;
return x.q<y.q;
}
bool cmp2(node x,node y)
{
if(x.b!=y.b) return x.b<y.b;
}
struct tree
{
int tr[2000001];
int lowbit(int t){return t&(-t);}
void add(int loc,int val){while(loc<=n){tr[loc]+=val;loc+=lowbit(loc);}}
int query(int loc){int ret=0;while(loc){ret+=tr[loc];loc-=lowbit(loc);}return ret;}
}T;
int ret[N<<2],top;
void cdq(int l=1,int r=cnt)
{
if(l==r) return;
int mid=(l+r)>>1;
cdq(l,mid),cdq(mid+1,r);
sort(a+l,a+mid+1,cmp2);sort(a+mid+1,a+1+r,cmp2);
int j=l;
for(int i=mid+1;i<=r;++i)
{
while(a[i].b>=a[j].b&&j<=mid){
T.add(a[j].c,a[j].cnt);
j++;
}
ret[a[i].q]+=T.query(a[i].c);
}
for(int i=l;i<j;++i)
T.add(a[i].c,-a[i].cnt);
}
void init()
{
read();n=read()+1;
int opt,x,y,x2,y2,num;
int time=0;
while(1)
{
time++;
opt=read();
if(opt==3) break;
if(opt==1)
{
x=read()+1;y=read()+1;num=read();
a[++cnt]=node{time,x,y,num,0};
}
if(opt==2)
{
x=read()+1;y=read()+1;x2=read()+1;y2=read()+1;
a[++cnt]=node{time,x2,y2,0,++top};
a[++cnt]=node{time,x-1,y-1,0,++top};
a[++cnt]=node{time,x-1,y2,0,++top};
a[++cnt]=node{time,x2,y-1,0,++top};
}
}
}
int main()
{
// freopen("in.in","r",stdin);
init();
sort(a+1,a+1+cnt,cmp1);
cdq();
for(int i=1;i<=top;i+=4)
{
cout<<ret[i]+ret[i+1]-ret[i+2]-ret[i+3]<<"\n";
}
return 0;
}
求解惑