博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

T7

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #include<algorithm>
  5 using namespace std;
  6 int s,n;
  7 int op;
  8 const int maxn=2e6+10;
  9 int c[maxn];
 10 struct SS
 11 {
 12     int lowbit(int x)
 13     {
 14         return x&(-x);
 15     }
 16     void add(int x,int w)
 17     {
 18         for(;x<=n;x+=lowbit(x))
 19         {
 20             c[x]+=w;
 21         }
 22     }
 23     int sum(int x)
 24     {
 25         int res=0;
 26         for(;x;x-=lowbit(x))
 27         {
 28             res+=c[x];
 29         }
 30         return res;
 31     }
 32 }XX;
 33 int ans[maxn];
 34 
 35 struct node
 36 {
 37     int id;
 38     int op;
 39     int x1,x2,y1,y2;
 40     bool operator <(const node &x)const 
 41     {
 42         if(x1==x.x1)
 43         {
 44             return op<x.op;
 45         }
 46         return x1<x.x1;
 47     }
 48 }way[maxn],a[maxn];
 49 void cdq(int l,int r)
 50 {
 51     if(l==r)
 52     {
 53         return ;
 54     }
 55     int mid=(l+r)>>1;
 56     cdq(l,mid);
 57     cdq(mid+1,r);
 58     int cnt=0;
 59     for(int i=l;i<=mid;i++)
 60     {
 61         if(way[i].op==1)
 62         {
 63             a[cnt++]=way[i];
 64         }
 65     }
 66     for(int i=mid+1;i<=r;i++)
 67     {
 68         if(way[i].op==2)
 69         {
 70             a[cnt++]=way[i];
 71             a[cnt-1].op=0;
 72             a[cnt++]=way[i];
 73             a[cnt-1].op=2;
 74             a[cnt-1].x1=way[i].x2;
 75         }
 76     }
 77     sort(a,a+cnt);
 78     for(int i=0;i<cnt;i++)
 79     {
 80         if(a[i].op==0)
 81         {
 82             ans[a[i].id]-=(XX.sum(a[i].y2)-XX.sum(a[i].y1-1));
 83         }
 84         else
 85         if(a[i].op==1)
 86         {
 87             XX.add(a[i].y1,a[i].x2);
 88         }
 89         else
 90         {
 91             ans[a[i].id]+=(XX.sum(a[i].y2)-XX.sum(a[i].y1-1));
 92         }
 93     }
 94 }
 95 inline int read()
 96 {
 97     int x=0,f=1;
 98     char ch=getchar();
 99     while(isdigit(ch)==0 && ch!='-')ch=getchar();
100     if(ch=='-')f=-1,ch=getchar();
101     while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
102     return x*f;
103 }
104 int main()
105 {
106     memset(c,0,sizeof(c));
107     memset(ans,0,sizeof(ans));
108     s=read();
109     n=read();
110     int cnt=0;
111     int tot=0;
112     while(scanf("%d",&op)&&op!=3)
113     {
114         if(op==1)
115         {
116             int x,y,z;
117             x=read();
118             y=read();
119             z=read();
120             way[++cnt].op=op;
121             way[cnt].id=-1;
122             way[cnt].x1=x;
123             way[cnt].y1=y;
124             way[cnt].x2=z;
125             way[cnt].y2=0;
126             
127         }
128         if(op==2)
129         {
130             int x1,x2,y1,y2;
131             x1=read();
132             y1=read();
133             x2=read();
134             y2=read();
135             way[++cnt].op=op;
136             way[cnt].id=++tot;
137             way[cnt].x1=x1;
138             way[cnt].x2=x2;
139             way[cnt].y1=y1;
140             way[cnt].y2=y2;
141         }
142     }
143     cdq(1,cnt);
144     for(int i=1;i<=tot;i++)
145     {
146         printf("%d\n",ans[i]);
147         //cout<<ans[i]<<endl;
148     }
149     return 0;
150 }

 

posted @ 2019-06-09 19:44  2529102757  阅读(133)  评论(0编辑  收藏  举报