Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ▄███████▄ ▄████████ ▄████████ ▄█ ▄█▄ # ▄█ █▄ ▄████████ ▄████████
- // ███ ███ ███ ███ ███ ███ ███ ▄███▀ ███ ███ ███ ███ ███ ███
- // ███ ███ ███ ███ ███ ███ ███▐██▀ ███ ███ ███ ███ ███ ███
- // ███ ███ ▄███▄▄▄▄██▀ ███ ███ ▄█████▀ ▄███▄▄▄▄███▄▄ ███ ███ ▄███▄▄▄▄██▀
- // ▀█████████▀ ▀▀███▀▀▀▀▀ ▀███████████ ▀▀█████▄ ▀▀███▀▀▀▀███▀ ▀███████████ ▀▀███▀▀▀▀▀
- // ███ ▀███████████ ███ ███ ███▐██▄ ███ ███ ███ ███ ▀███████████
- // ███ ███ ███ ███ ███ ███ ▀███▄ ███ ███ ███ ███ ███ ███
- // ▄████▀ ███ ███ ███ █▀ ███ ▀█▀ ███ █▀ ███ █▀ ███ ███
- // ███ ███ ▀ ███ ███
- // ▄█ ▄████████ ▄█ ▄████████ ███▄▄▄▄
- // ███ ███ ███ ███ ███ ███ ███▀▀▀██▄
- // ███ ███ ███ ███ ███ ███ ███ ███
- // ███ ███ ███ ███ ███ ███ ███ ███
- // ███ ▀███████████ ███ ▀███████████ ███ ███
- // ███ ███ ███ ███ ███ ███ ███ ███
- // ███ ███ ███ ███▌ ▄ ███ ███ ███ ███
- // █▄ ▄███ ███ █▀ █████▄▄██ ███ █▀ ▀█ █▀
- // ▀▀▀▀▀▀ ▀
- #include<bits/stdc++.h>
- using namespace std;
- //#include<ext/pb_ds/assoc_container.hpp>
- //#include<ext/pb_ds/tree_policy.hpp>
- //#include<ext/pb_ds/trie_policy.hpp>
- //using namespace __gnu_pbds;
- //typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
- //typedef trie<string,null_type,trie_string_access_traits<>,pat_trie_tag,trie_prefix_search_node_update> Trie;
- #define fo(i,n) for(int i=0;i<n;i++)
- #define rfo(i,n) for(int i=n-1;i>=0;i--)
- #define fo1(i,n) for(int i=1;i<=n;i++)
- #define rfo1(i,n) for(int i=n;i>0;i--)
- #define pii pair<int,int>
- #define fast ios_base::sync_with_stdio(false);cin.tie(NULL);
- #define all(v) v.begin(),v.end()
- #define vi vector<int>
- #define mii map<int,int>
- #define mivi map<int,vector<int>>
- #define int long long
- #define tc int testcases;cin>>testcases;while(testcases--)
- #define setbits(x) __builtin_popcountll(x)
- #define zerobits(x) __builtin_ctzll(x)
- #define fill(x,y) memset(x,y,sizeof(x))
- #define f(i,container) for(auto &i:container)
- void shift(int si,vector<vi>&segtree)
- {
- int temp=segtree[si][2];
- segtree[si][2]=segtree[si][1];
- segtree[si][1]=segtree[si][0];
- segtree[si][0]=temp;
- }
- void build(vi &v,vector<vi> &segtree,int ss,int se,int si)
- {
- if(ss==se)
- {
- segtree[si][0]++;
- return;
- }
- int m=(ss+se)/2;
- build(v,segtree,ss,m,2*si);
- build(v,segtree,m+1,se,2*si+1);
- segtree[si][0]=segtree[2*si][0]+segtree[2*si+1][0];
- }
- void update(vector<vi>&segtree,vi &lazy,int ss,int se,int si,int qs,int qe)
- {
- if(lazy[si]!=0)
- {
- int add=lazy[si];
- lazy[si]=0;
- if(ss!=se) lazy[2*si]+=add,lazy[2*si+1]+=add;
- add=add%3;
- fo(i,add) shift(si,segtree);
- }
- if(ss>qe or se<qs) return;
- if(ss>=qs && se<=qe)
- {
- shift(si,segtree);
- if(ss!=se) lazy[2*si]++,lazy[2*si+1]++;
- return;
- }
- int m=(ss+se)/2;
- update(segtree,lazy,ss,m,2*si,qs,qe);
- update(segtree,lazy,m+1,se,2*si+1,qs,qe);
- segtree[si][0]=segtree[2*si][0]+segtree[2*si+1][0];
- segtree[si][1]=segtree[2*si][1]+segtree[2*si+1][1];
- segtree[si][2]=segtree[2*si][2]+segtree[2*si+1][2];
- }
- int query(vector<vi>&segtree,vi lazy,int ss,int se,int si,int qs,int qe)
- {
- if(lazy[si]!=0)
- {
- int add=lazy[si];
- lazy[si]=0;
- if(ss!=se) lazy[2*si]+=add,lazy[2*si+1]+=add;
- add=add%3;
- fo(i,add) shift(si,segtree);
- }
- if(ss>qe or se<qs) return 0;
- if(ss>=qs && se<=qe) return segtree[si][0];
- int m=(ss+se)/2;
- int left=query(segtree,lazy,ss,m,2*si,qs,qe);
- int right=query(segtree,lazy,m+1,se,2*si+1,qs,qe);
- return left+right;
- }
- signed main()
- {
- fast
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- int n,q;
- cin>>n>>q;
- vi lazy(4*n,0);
- vector<vi> segtree(4*n,vi (3,0));
- vi v(n,0);
- build(v,segtree,0,n-1,1);
- while (q--)
- {
- int type,a,b;
- cin>>type>>a>>b;
- if(type)
- {
- cout<<query(segtree,lazy,0,n-1,1,a,b)<<"\n";
- }
- else update(segtree,lazy,0,n-1,1,a,b);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement