/
3018.cpp
120 lines (119 loc) · 1.99 KB
/
3018.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include<cstdio>
#include<cstring>
#define MAXM 500000
#define MAXN 20000
struct segtree
{
int sum;
int l,r,a,b;
int ch[4];
}seg[MAXM];
char str[100];
int ff,cnt;
void up(int i)
{
seg[i].sum=0;
for(int j=0;j<4;j++)
if(seg[i].ch[j])
seg[i].sum+=seg[seg[i].ch[j]].sum;
}
int get(int l,int r,int a,int b)
{
seg[++cnt].l=l;
seg[cnt].r=r;
seg[cnt].a=a;
seg[cnt].b=b;
memset(seg[cnt].ch,0,sizeof(seg[cnt].ch));
seg[cnt].sum=0;
return cnt;
}
void ud(int x,int y,int i,int n)
{
if(seg[i].l==seg[i].r&&seg[i].a==seg[i].b)
{
seg[i].sum+=n;
return;
}
int xm=(seg[i].l+seg[i].r)>>1;
int ym=(seg[i].a+seg[i].b)>>1;
if(xm>=x&&ym>=y)
{
if(!seg[i].ch[0])
seg[i].ch[0]=get(seg[i].l,xm,seg[i].a,ym);
ud(x,y,seg[i].ch[0],n);
}
if(xm>=x&&ym<y)
{
if(!seg[i].ch[1])
seg[i].ch[1]=get(seg[i].l,xm,ym+1,seg[i].b);
ud(x,y,seg[i].ch[1],n);
}
if(xm<x&&ym>=y)
{
if(!seg[i].ch[2])
seg[i].ch[2]=get(xm+1,seg[i].r,seg[i].a,ym);
ud(x,y,seg[i].ch[2],n);
}
if(xm<x&&ym<y)
{
if(!seg[i].ch[3])
seg[i].ch[3]=get(xm+1,seg[i].r,ym+1,seg[i].b);
ud(x,y,seg[i].ch[3],n);
}
up(i);
}
int qu(int a,int b,int c,int d,int i)
{
if(a<=seg[i].l&&seg[i].r<=b&&c<=seg[i].a&&seg[i].b<=d)
return seg[i].sum;
if(b<seg[i].l||seg[i].r<a||c>seg[i].b||seg[i].a>d)
return 0;
int t=0;
for(int j=0;j<4;j++)
if(seg[i].ch[j])
t+=qu(a,b,c,d,seg[i].ch[j]);
return t;
}
int main()
{
while(gets(str)!=NULL)
{
cnt=0;
ff=1;
get(1,MAXN,1,MAXN);
while(1)
{
if(str[0]=='E')
break;
if(str[0]=='I')
{
ff=1;
gets(str);
continue;
}
else
if(str[0]=='Q')
{
ff=0;
gets(str);
continue;
}
else
{
int a,b,c,d;
if(ff)
{
sscanf(str,"%d%d%d",&a,&b,&c);
ud(a,b,1,c);
}
else
{
sscanf(str,"%d%d%d%d",&a,&b,&c,&d);
printf("%d\n",qu(a,b,c,d,1));
}
}
gets(str);
}
}
return 0;
}