记录编号 464281 评测结果 AAAAAAAAAA
题目名称 [BOI 2007] 摩基亚Mokia 最终得分 100
用户昵称 Gravatar하루Kiev 是否通过 通过
代码语言 C++ 运行时间 1.481 s
提交时间 2017-10-25 15:55:06 内存使用 47.62 MiB
显示代码纯文本
# include "iostream"
# include "stdio.h"
# include "algorithm"
# include "string.h"
# include "math.h"
# define maxn 800005
using namespace std;
# define lowbit(x) (x&-x)
struct node{
       int id,x,y,val,opt,qes;
       bool operator <(node A)const{
           if(x==A.x&&y==A.y) return opt<A.opt;
           return x==A.x?y<A.y:x<A.x;
       }
}e[maxn],s[maxn];

int n,cnt,ans,ANS[maxn];
int ai,opt,a,b,c,d;
int sum[2000005];

void update(int i,int x){
     for(;i<=n;i+=lowbit(i))
         sum[i]+=x;
}
int SUM(int x){
    int ret=0;
    for(;x;x-=lowbit(x)) ret+=sum[x];
    return ret;
}

void CDQ(int l,int r){
     if(l==r) return;
     int mid=(l+r)/2,s1=l,s2=mid+1;
     for(int i=l;i<=r;i++){
         if(e[i].id<=mid&&e[i].opt==1) {update(e[i].y,e[i].val);}
         if(e[i].id>mid&&e[i].opt==2){
             //cout<<" "<<SUM(e[i].y)*e[i].val<<" ";
            ANS[e[i].qes]+=SUM(e[i].y)*e[i].val;
            //cout<<SUM(e[i].y)<<" ";
         }
     }
     for(int i=l;i<=r;i++) if(e[i].id<=mid&&e[i].opt==1) update(e[i].y,-e[i].val);
     for(int i=l;i<=r;i++){
         if(e[i].id>mid) s[s2++]=e[i];
         else s[s1++]=e[i];
     }
     for(int i=l;i<=r;i++) e[i]=s[i];
     CDQ(l,mid);CDQ(mid+1,r);
}
int main(){
    freopen("mokia.in","r",stdin);
    freopen("mokia.out","w",stdout);
    scanf("%d%d",&ai,&n);
    while(true){
          scanf("%d",&opt);
          if(opt==3) break;
          if(opt==1){
             ++cnt;e[cnt].opt=1;e[cnt].id=cnt;
             scanf("%d%d%d",&e[cnt].x,&e[cnt].y,&e[cnt].val);
          }
          if(opt==2){
             scanf("%d%d%d%d",&a,&b,&c,&d);ans++;
             ++cnt;e[cnt].qes=ans,e[cnt].opt=2,e[cnt].id=cnt;e[cnt].x=c,e[cnt].y=d,e[cnt].val=1;
             ++cnt;e[cnt].qes=ans,e[cnt].opt=2,e[cnt].id=cnt;e[cnt].x=a-1,e[cnt].y=b-1,e[cnt].val=1;
             ++cnt;e[cnt].qes=ans,e[cnt].opt=2,e[cnt].id=cnt;e[cnt].x=a-1,e[cnt].y=d,e[cnt].val=-1;
             ++cnt;e[cnt].qes=ans,e[cnt].opt=2,e[cnt].id=cnt;e[cnt].x=c,e[cnt].y=b-1,e[cnt].val=-1;
          }
    }sort(e+1,e+1+cnt);
    CDQ(1,cnt);
    for(int i=1;i<=ans;i++) printf("%d\n",ANS[i]);
}
/*
0 4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

3 5
*/