Skip to content

Commit 7ca4605

Browse files
Add files via upload
1 parent 511494f commit 7ca4605

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#include <cstdio>
2+
3+
const int MAX_SIZE = 1e5, OFF = 0, ON = 1;
4+
int tree[3*MAX_SIZE];
5+
int lazy[3*MAX_SIZE] = {0};
6+
int light[MAX_SIZE] = {OFF};
7+
8+
void build(int node, int start, int end)
9+
{
10+
if(start == end)
11+
{
12+
tree[node] = light[start];
13+
return;
14+
}
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+
}
22+
23+
void propagate(int node, int start, int end)
24+
{
25+
int on_lights = tree[node];
26+
int total_lights = end - (start - 1);
27+
int off_lights = total_lights - on_lights;
28+
29+
if(lazy[node]%2 == 1)
30+
tree[node] = off_lights;
31+
32+
if(start != end)
33+
{
34+
lazy[2*node] += lazy[node];
35+
lazy[2*node + 1] += lazy[node];
36+
}
37+
38+
lazy[node] = 0;
39+
}
40+
41+
void update(int node, int start, int end, int query_start, int query_end)
42+
{
43+
if(lazy[node] != 0)
44+
propagate(node, start, end);
45+
46+
if(query_start > end || query_end < start)
47+
return;
48+
49+
if(query_start <= start && end <= query_end)
50+
{
51+
int no_of_lights = end - (start - 1);
52+
int no_of_on_lights = tree[node];
53+
int no_of_off_lights = no_of_lights - no_of_on_lights;
54+
55+
tree[node] = no_of_off_lights;
56+
57+
if(start != end)
58+
{
59+
lazy[2*node]++;
60+
lazy[2*node + 1]++;
61+
}
62+
return;
63+
}
64+
65+
int mid = (start + end)/2;
66+
67+
update(2*node, start, mid, query_start, query_end);
68+
update(2*node + 1, mid + 1, end, query_start, query_end);
69+
70+
tree[node] = tree[2*node] + tree[2*node + 1];
71+
}
72+
73+
int query(int node, int start, int end, int query_start, int query_end)
74+
{
75+
if(lazy[node] != 0)
76+
propagate(node, start, end);
77+
78+
if(query_start > end || query_end < start)
79+
return 0;
80+
81+
if(query_start <= start && end <= query_end)
82+
return tree[node];
83+
84+
int mid = (start + end)/2;
85+
86+
int left_answer = query(2*node, start, mid, query_start, query_end);
87+
int right_answer = query(2*node + 1, mid + 1, end, query_start, query_end);
88+
89+
return (left_answer + right_answer);
90+
}
91+
92+
int main()
93+
{
94+
int no_of_lights, no_of_operations;
95+
scanf("%d %d", &no_of_lights, &no_of_operations);
96+
97+
build(1, 1, no_of_lights);
98+
99+
while(no_of_operations--)
100+
{
101+
int type, left, right;
102+
scanf("%d %d %d", &type, &left, &right);
103+
104+
if(type == 0)
105+
{
106+
update(1, 1, no_of_lights, left, right);
107+
}
108+
else if(type == 1)
109+
{
110+
int answer = query(1, 1, no_of_lights, left, right);
111+
printf("%d\n", answer);
112+
}
113+
}
114+
return 0;
115+
}

0 commit comments

Comments
 (0)