1
- typedef long long ll;
1
+ // Runtime: 340 ms (Top 55.43%) | Memory: 310.90 MB (Top 5.43%)
2
+
2
3
class Solution {
3
4
public:
4
- static const ll maxn= 1e5 + 6 ;
5
- ll seg[maxn<< 2 ] ;
6
- bool lzy[maxn<< 2 ];
7
- void seg_init (int cur ,int l ,int r,vector< int > &nums )
5
+ typedef long long ll ;
6
+ vector<ll> a, tree, lazy ;
7
+
8
+ void build (int node ,int start ,int end )
8
9
{
9
- if (l+ 1 ==r )
10
+ if (start == end )
10
11
{
11
- seg[cur]=nums[l];
12
- lzy[cur]=0 ;
12
+ tree[node] = a[start];
13
13
return ;
14
14
}
15
- int mid=(l+r)>> 1 ;
16
- seg_init (cur<< 1 ,l, mid,nums) ;
17
- seg_init (cur<< 1 | 1 ,mid,r,nums );
18
- seg[cur]=seg[cur<< 1 ]+seg[cur<< 1 | 1 ] ;
19
- lzy[cur]= 0 ;
20
- return ;
15
+
16
+ int mid = (start + end) / 2 ;
17
+ build ( 2 *node,start,mid );
18
+ build ( 2 *node+ 1 ,mid+ 1 ,end) ;
19
+
20
+ tree[node] = tree[ 2 *node] + tree[ 2 *node+ 1 ] ;
21
21
}
22
- void pushdown (int cur,int l,int r)
22
+
23
+ ll query (int node,int start,int end,int l,int r)
23
24
{
24
- if (lzy[cur] )
25
+ if (lazy[node]% 2 == 1 )
25
26
{
26
- lzy[cur]^=1 ;
27
- int mid=(l+r)>>1 ;
28
- lzy[cur<<1 ]^=1 ;
29
- lzy[cur<<1 |1 ]^=1 ;
30
- seg[cur<<1 ]=mid-l-seg[cur<<1 ];
31
- seg[cur<<1 |1 ]=r-mid-seg[cur<<1 |1 ];
27
+ int k = lazy[node];
28
+
29
+ lazy[node] = 0 ;
30
+ tree[node] = (end - start + 1 ) - tree[node];
31
+
32
+ if (start!=end)
33
+ {
34
+ lazy[2 *node] += k ;
35
+ lazy[2 *node+1 ] += k;
36
+ }
32
37
}
33
- return ;
38
+
39
+ if (start>r || end<l)
40
+ return 0 ;
41
+
42
+ if (start>=l && end<=r)
43
+ return tree[node];
44
+
45
+ ll mid = (start + end) / 2 ;
46
+
47
+ ll left = query (2 *node,start,mid,l,r);
48
+ ll right = query (2 *node+1 ,mid+1 ,end,l,r);
49
+ return left + right;
34
50
}
35
- void update (int cur,int l,int r,int tl,int tr)
51
+
52
+ void update (int node,int start,int end,int l,int r,int val)
36
53
{
37
- if (tl>=r||tr<=l)return ;
38
- if (tl<=l&&r<=tr)
54
+ if (lazy[node]%2 ==1 )
39
55
{
40
- seg[cur]=r-l-seg[cur];
41
- lzy[cur]^=1 ;
42
- return ;
56
+ int k = lazy[node];
57
+ lazy[node] = 0 ;
58
+ tree[node] =(end - start + 1 ) - tree[node] ;
59
+
60
+ if (start!=end)
61
+ {
62
+ lazy[2 *node] += k ;
63
+ lazy[2 *node+1 ] += k;
64
+ }
43
65
}
44
- pushdown (cur,l,r);
45
- int mid=(l+r)>>1 ;
46
- update (cur<<1 ,l,mid,tl,tr);
47
- update (cur<<1 |1 ,mid,r,tl,tr);
48
- seg[cur]=seg[cur<<1 ]+seg[cur<<1 |1 ];
66
+
67
+
68
+ if (start>r || end<l)
49
69
return ;
50
- }
51
- vector<long long > handleQuery (vector<int >& nums1, vector<int >& nums2, vector<vector<int >>& queries)
52
- {
53
- int n=nums1.size ();
54
- seg_init (1 ,0 ,n,nums1);
55
- ll val=0 ;
56
- for (auto &x:nums2)val+=x;
57
- vector<ll>res;
58
- for (auto &x:queries)
70
+
71
+ if (start>=l && end<=r)
59
72
{
60
- if (x[0 ]==1 )
73
+ int k = (end - start + 1 ) - tree[node];
74
+ tree[node] = k;
75
+
76
+ if (start!=end)
61
77
{
62
- update (1 ,0 ,n,x[1 ],x[2 ]+1 );
63
- }else if (x[0 ]==2 )
64
- {
65
- val+=seg[1 ]*x[1 ];
66
- }else res.push_back (val);
78
+ lazy[2 *node] += val;
79
+ lazy[2 *node+1 ] += val;
80
+ }
81
+
82
+ return ;
83
+ }
84
+
85
+ int mid = (start + end) / 2 ;
86
+
87
+ update (2 *node,start,mid,l,r,val);
88
+ update (2 *node+1 ,mid+1 ,end,l,r,val);
89
+
90
+ tree[node] = tree[2 *node+1 ] + tree[2 *node];
91
+ }
92
+
93
+ vector<long long > handleQuery (vector<int >& nums1, vector<int >& nums2, vector<vector<int >>& queries) {
94
+ ll sum2 = 0 ;
95
+ int nn = 100005 ;
96
+ a.resize (nn,0 );
97
+ tree.resize (4 *nn,0 );
98
+ lazy.resize (4 *nn,0 );
99
+
100
+ int n = nums1.size ();
101
+ for (auto &i:nums2){
102
+ sum2+=i;
103
+ }
104
+
105
+ for (int i = 0 ;i<n;i++){
106
+ a[i+1 ] = nums1[i];
107
+ }
108
+ vector<ll>ans;
109
+ build (1 ,1 ,n);
110
+ for (auto &i:queries){
111
+ if (i[0 ]==1 ){
112
+ update (1 ,1 ,n,i[1 ]+1 ,i[2 ]+1 ,1 );
113
+ }
114
+ else if (i[0 ]==2 ){
115
+ ll p = i[1 ];
116
+ sum2+= p*query (1 ,1 ,n,1 ,n);
117
+ }
118
+ else if (i[0 ]==3 ){
119
+ ans.push_back (sum2);
120
+ }
67
121
}
68
- return res;
122
+
123
+ return ans;
124
+
69
125
}
70
- };
126
+ };
0 commit comments