Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- #define debug(x) cerr << '[' << (#x) << "] = " << x << '\n';
- template<class T> using ordered_set = tree<T, null_type , less<T> , rb_tree_tag , tree_order_statistics_node_update> ;
- struct Data{
- int mod[3] = {0};
- };
- const int maxn = 100005;
- Data segment_tree[maxn<<2];
- int lazy[maxn<<2];
- void toggle(int extent, Data& a) {
- while(extent-->0)
- swap(a.mod[2], a.mod[1]), swap(a.mod[0], a.mod[1]);
- }
- Data combine(Data a, Data b) {
- for(int i=0; i<3; ++i) a.mod[i] += b.mod[i];
- return a;
- }
- void update(int l, int r, int L, int R, int node) {
- if(r<L || l>R) return;
- if(l>=L && r<=R) {
- ++lazy[node];
- lazy[node] %= 3;
- toggle(1, segment_tree[node]);
- return;
- }
- int mid = (l+r)>>1;
- update(l, mid, L, R, node*2);
- update(mid+1, r, L, R, node*2+1);
- segment_tree[node] = combine(segment_tree[node*2], segment_tree[node*2+1]);
- toggle(lazy[node], segment_tree[node]);
- }
- Data query(int l, int r, int L, int R, int node) {
- if(l>R || r<L) {
- Data ret;
- return ret;
- }
- if(l>=L && r<=R) {
- return segment_tree[node];
- }
- int mid = (l+r)>>1;
- Data ret = combine(query(l, mid, L, R, node*2), query(mid+1, r, L, R, node*2+1));
- toggle(lazy[node], ret);
- return ret;
- }
- void build(int l, int r, int node) {
- if(l==r) {
- segment_tree[node].mod[0] = 1;
- return;
- }
- int mid = (l+r)>>1;
- build(l, mid, node*2);
- build(mid+1, r, node*2+1);
- segment_tree[node].mod[0] = r-l+1;
- }
- void PlayGround() {
- int n, q; cin >> n >> q;
- build(1, n, 1);
- while(q--) {
- int type; cin >> type;
- if(type==1) {
- int l, r; cin >> l >> r;
- ++l, ++r;
- Data got = query(1, n, l, r, 1);
- cout << got.mod[0] << '\n';
- } else {
- int l, r; cin >> l >> r;
- ++l, ++r;
- update(1, n, l, r, 1);
- }
- }
- cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
- }
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- #endif
- PlayGround();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement