Skip to content

Commit d142d29

Browse files
Add files via upload
1 parent d89d1f5 commit d142d29

File tree

1 file changed

+141
-0
lines changed

1 file changed

+141
-0
lines changed
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#include <cstdio>
2+
3+
const int MAX_SIZE = 1e5 + 3;
4+
5+
int tree[3*MAX_SIZE][3];
6+
int lazy[3*MAX_SIZE] = {0};
7+
int element[MAX_SIZE] = {0};
8+
9+
void swap(int &a, int &b, int &c)
10+
{
11+
int temp_a = a, temp_b = b, temp_c = c;
12+
13+
c = temp_b;
14+
b = temp_a;
15+
a = temp_c;
16+
}
17+
18+
void build(int node, int start, int end)
19+
{
20+
if(start == end)
21+
{
22+
int mod = element[start]%3;
23+
int mod_2 = (mod + 1)%3, mod_3 = (mod + 2)%3;
24+
25+
tree[node][mod] = 1;
26+
tree[node][mod_2] = tree[node][mod_3] = 0;
27+
28+
return;
29+
}
30+
31+
int mid = (start + end)/2;
32+
33+
build(2*node, start, mid);
34+
build(2*node + 1, mid + 1, end);
35+
36+
for(int m = 0; m < 3; m++)
37+
tree[node][m] = tree[2*node][m] + tree[2*node + 1][m];
38+
}
39+
40+
void propagate(int node, int start, int end)
41+
{
42+
int no_of_additions = lazy[node]%3;
43+
44+
if(no_of_additions == 1)
45+
{
46+
swap(tree[node][0], tree[node][1], tree[node][2]);
47+
}
48+
else if(no_of_additions == 2)
49+
{
50+
swap(tree[node][0], tree[node][2], tree[node][1]);
51+
}
52+
53+
if(start != end)
54+
{
55+
lazy[2*node] = (lazy[2*node] + lazy[node])%3;
56+
lazy[2*node + 1] = (lazy[2*node + 1] + lazy[node])%3;
57+
}
58+
lazy[node] = 0;
59+
}
60+
61+
void update(int node, int start, int end, int query_start, int query_end)
62+
{
63+
if(lazy[node])
64+
propagate(node, start, end);
65+
66+
if(query_start > end || query_end < start)
67+
return;
68+
69+
if(query_start <= start && end <= query_end)
70+
{
71+
swap(tree[node][0], tree[node][1], tree[node][2]);
72+
73+
if(start != end)
74+
{
75+
lazy[2*node]++;
76+
lazy[2*node] %= 3;
77+
78+
lazy[2*node + 1]++;
79+
lazy[2*node + 1] %= 3;
80+
}
81+
return;
82+
}
83+
84+
int mid = (start + end)/2;
85+
86+
update(2*node, start, mid, query_start, query_end);
87+
update(2*node + 1, mid + 1, end, query_start, query_end);
88+
89+
for(int m = 0; m < 3; m++)
90+
tree[node][m] = tree[2*node][m] + tree[2*node + 1][m];
91+
}
92+
93+
int query(int node, int start, int end, int query_start, int query_end)
94+
{
95+
if(lazy[node])
96+
propagate(node, start, end);
97+
98+
if(query_start > end || query_end < start)
99+
return 0;
100+
101+
if(query_start <= start && end <= query_end)
102+
return tree[node][0];
103+
104+
int mid = (start + end)/2;
105+
106+
int left_answer = query(2*node, start, mid, query_start, query_end);
107+
int right_answer = query(2*node + 1, mid + 1, end, query_start, query_end);
108+
109+
return (left_answer + right_answer);
110+
}
111+
112+
int main()
113+
{
114+
int no_of_elements;
115+
scanf("%d", &no_of_elements);
116+
117+
build(1, 1, no_of_elements);
118+
119+
int no_of_queries;
120+
scanf("%d", &no_of_queries);
121+
122+
while(no_of_queries--)
123+
{
124+
int type, left, right;
125+
scanf("%d %d %d", &type, &left, &right);
126+
127+
left++, right++;
128+
129+
if(type == 0)
130+
{
131+
update(1, 1, no_of_elements, left, right);
132+
}
133+
else if(type == 1)
134+
{
135+
int answer = query(1, 1, no_of_elements, left, right);
136+
printf("%d\n", answer);
137+
}
138+
}
139+
140+
return 0;
141+
}

0 commit comments

Comments
 (0)