Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- #define ll long long
- #define ld double
- #define llu long long unsigned
- #define mx 3000001
- int arr[ mx ];
- struct info {
- int prop, sum0 , sum1;
- } tree[mx * 3];
- void init(int node, int b, int e)
- {
- if (b == e) {
- tree[node].sum0 = 1;
- tree[node].sum1 = 0;
- return;
- }
- int Left = node << 1;
- int Right = ( node << 1 ) + 1;
- int mid = (b + e) >> 1;
- init(Left, b, mid);
- init(Right, mid + 1, e);
- tree[node].sum0 = tree[Left].sum0 + tree[Right].sum0;
- tree[node].sum1 = tree[Left].sum1 + tree[Right].sum1;
- }
- void update(int node, int b, int e, int i, int j, int x)
- {
- if (i > e || j < b)
- return;
- if (b >= i && e <= j)
- {
- swap( tree[node].sum0 , tree[node].sum1 );
- // tree[node].sum += ((e - b + 1) * x); // adding sum
- tree[node].prop += x;
- return;
- }
- int Left = node << 1;
- int Right = (node << 1) + 1;
- int mid = (b + e) >> 1;
- update(Left, b, mid, i, j, x);
- update(Right, mid + 1, e, i, j, x);
- tree[node].sum0 = tree[Left].sum0 + tree[Right].sum0;
- tree[node].sum1 = tree[Left].sum1 + tree[Right].sum1;
- int rot = tree[node].prop % 2;
- if( rot )
- {
- swap( tree[node].sum0 , tree[node].sum1 );
- }
- }
- info query(int node, int b, int e, int i, int j, int carry = 0)
- {
- if (i > e || j < b)
- {
- info tmp;
- tmp.prop = 0;
- tmp.sum0 = 0;
- tmp.sum1 = 0;
- return tmp;
- }
- if (b >= i and e <= j)
- {
- info tr;
- tr = tree[node];
- int rot = carry % 2;
- if( rot )
- {
- swap( tr.sum0 , tr.sum1 );
- }
- return tr;
- // return tree[node].sum + carry * (e - b + 1);
- }
- int Left = node << 1;
- int Right = (node << 1) + 1;
- int mid = (b + e) >> 1;
- info p1 = query(Left, b, mid, i, j, carry + tree[node].prop);
- info p2 = query(Right, mid + 1, e, i, j, carry + tree[node].prop);
- info tmp;
- tmp.sum0 = p1.sum0 + p2.sum0;
- tmp.sum1 = p1.sum1 + p2.sum1;
- tmp.prop = 0;
- return tmp;
- // return p1 + p2;
- }
- int main()
- {
- fast;
- int n , q;
- cin>>n>>q;
- init( 1 , 1 , n );
- while( q-- )
- {
- int t;
- cin>>t;
- if( t == 0 )
- {
- int i , j;
- cin>>i>>j;
- update( 1 , 1 , n , i+1 , j+1 , 1 );
- }
- else if( t == 1 )
- {
- int i , j;
- cin>>i>>j;
- info tmp;
- tmp = query( 1 , 1 , n , i+1 , j+1 );
- cout<<tmp.sum1<<endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement