Skip to content

Commit 13b0f52

Browse files
committed
Runtime: 340 ms (Top 55.43%) | Memory: 310.90 MB (Top 5.43%)
1 parent e749f6e commit 13b0f52

File tree

1 file changed

+107
-51
lines changed

1 file changed

+107
-51
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,126 @@
1-
typedef long long ll;
1+
// Runtime: 340 ms (Top 55.43%) | Memory: 310.90 MB (Top 5.43%)
2+
23
class Solution {
34
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)
89
{
9-
if(l+1==r)
10+
if(start == end)
1011
{
11-
seg[cur]=nums[l];
12-
lzy[cur]=0;
12+
tree[node] = a[start];
1313
return;
1414
}
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];
2121
}
22-
void pushdown(int cur,int l,int r)
22+
23+
ll query(int node,int start,int end,int l,int r)
2324
{
24-
if(lzy[cur])
25+
if(lazy[node]%2==1)
2526
{
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+
}
3237
}
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;
3450
}
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)
3653
{
37-
if(tl>=r||tr<=l)return;
38-
if(tl<=l&&r<=tr)
54+
if(lazy[node]%2==1)
3955
{
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+
}
4365
}
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)
4969
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)
5972
{
60-
if(x[0]==1)
73+
int k = (end - start + 1) - tree[node];
74+
tree[node] = k;
75+
76+
if(start!=end)
6177
{
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+
}
67121
}
68-
return res;
122+
123+
return ans;
124+
69125
}
70-
};
126+
};

0 commit comments

Comments
 (0)