Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define pi 3.141592654
- #define fix(n) cout << fixed << setprecision(n)
- #define rep(i,a,b) for(int i=a;i<b;i++)
- #define ren(i,a,b) for(int i=a;i>=b;i--)
- #define si(d) scanf("%d",&d)
- #define sll(d) scanf("%lld",&d)
- #define pin(d) printf("%d\n",d)
- #define pln(d) printf("%lld\n",d)
- #define nl printf("\n")
- #define ll long long
- #define ull unsigned long long
- #define mp make_pair
- #define pb push_back
- #define fi first
- #define se second
- #define chalne_de continue
- int mod=1000000007;
- const int N = 1024005;
- int tree[4*N];
- int lazy[4*N];
- int a[4*N];
- ll gcd(ll a , ll b)
- {
- if ( b == 0)
- return a;
- return gcd( b, a % b);
- }
- void build ( int node , int st,int en)
- {
- if ( st > en)
- return ;
- if (st == en)
- {
- tree[node] = a[st];
- return ;
- }
- int mid = (st+en) / 2 ;
- build(node*2,st,mid);
- build(node*2+1,mid+1,en);
- tree[node] = tree[node*2] + tree[node*2+1];
- }
- void update(int node,int st,int en,int l, int r, int ty)
- {
- if ( lazy[node] != 0)
- {
- if ( lazy[node] == 1)
- {
- tree[node] = (en-st+1) - tree[node];
- if ( st != en)
- {
- if ( lazy[node*2] == 1 || lazy[node*2] == 0)
- lazy[node*2] = 1 - lazy[node*2];
- else
- lazy[node*2] = (lazy[node*2] == 2?3:2);
- if ( lazy[node*2+1] == 1 || lazy[node*2+1] == 0)
- lazy[node*2+1] = 1 - lazy[node*2+1];
- else
- lazy[node*2+1] = (lazy[node*2+1] == 2?3:2);
- }
- }
- else if ( lazy[node] == 2)
- {
- tree[node] = (en-st+1);
- if ( st != en)
- {
- lazy[node*2] = 2 ;
- lazy[node*2+1] = 2;
- }
- }
- else
- {
- tree[node] = 0;
- if ( st != en)
- {
- lazy[node*2] = 3 ;
- lazy[node*2+1] = 3;
- }
- }
- lazy[node] = 0;
- }
- if ( st > en || st > r || en < l)
- return ;
- if ( st >= l && en <= r)
- {
- if ( ty == 1)
- {
- tree[node] = (en-st+1) - tree[node];
- if ( st != en)
- {
- if ( lazy[node*2] == 0 || lazy[node*2] == 1)
- lazy[node*2] = 1 - lazy[node*2];
- else
- lazy[node*2] = (lazy[node*2] == 2?3:2);
- if ( lazy[node*2+1] == 1 || lazy[node*2+1] == 0)
- lazy[node*2+1] = 1 - lazy[node*2+1];
- else
- lazy[node*2+1] = (lazy[node*2+1] == 2?3:2);
- }
- }
- else if ( ty == 2)
- {
- tree[node] = en - st + 1;
- if ( st != en)
- {
- lazy[node*2] = 2 ;
- lazy[node*2+1] = 2;
- }
- }
- else
- {
- tree[node] = 0;
- if ( st != en)
- {
- lazy[node*2] = 3 ;
- lazy[node*2+1] = 3;
- }
- }
- return ;
- }
- int mid = (st+en)/2;
- update(node*2,st,mid,l,r,ty);
- update(node*2+1,mid+1,en,l,r,ty);
- tree[node] = tree[node*2] + tree[node*2+1];
- }
- int query(int node,int st,int en,int l,int r)
- {
- if ( lazy[node] != 0)
- {
- if ( lazy[node] == 1)
- {
- tree[node] = (en-st+1) - tree[node];
- if ( st != en)
- {
- if ( lazy[node*2] == 1 || lazy[node*2] == 0)
- lazy[node*2] = 1 - lazy[node*2];
- else
- lazy[node*2] = (lazy[node*2] == 2?3:2);
- if ( lazy[node*2+1] == 1 || lazy[node*2+1] == 0)
- lazy[node*2+1] = 1 - lazy[node*2+1];
- else
- lazy[node*2+1] = (lazy[node*2+1] == 2?3:2);
- }
- }
- else if ( lazy[node] == 2)
- {
- tree[node] = (en-st+1);
- if ( st != en)
- {
- lazy[node*2] = 2 ;
- lazy[node*2+1] = 2;
- }
- }
- else
- {
- tree[node] = 0;
- if ( st != en)
- {
- lazy[node*2] = 3 ;
- lazy[node*2+1] = 3;
- }
- }
- lazy[node] = 0;
- }
- if ( st > en || st > r || en < l)
- return 0;
- if ( st >= l && en <= r)
- return tree[node];
- int mid = (st+en) / 2 ;
- int p = query(node*2,st,mid,l,r);
- int q = query(node*2+1,mid+1,en,l,r);
- return p + q;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(NULL);
- int t;
- cin >> t ;
- int tc = 1;
- while(t-- )
- {
- memset(tree,0,sizeof(tree));
- memset(lazy,0,sizeof(lazy));
- memset(a,0,sizeof(a));
- int num = 1;
- string s = "";
- cout << "Case "<<tc<<":\n";
- tc++;
- int n ;
- cin >> n ;
- rep(i,0,n)
- {
- int cnt;
- cin >> cnt;
- string p ;
- cin >> p ;
- rep(j,0,cnt)
- s += p;
- }
- n = s.length();
- for ( int i =0;i<n;i++)
- a[i] = (s[i] == '1');
- build(1,0,n-1);
- int q ;
- cin >> q ;
- while ( q-- )
- {
- char c ;
- int l ,r ;
- cin >> c >> l >> r;
- if (c == 'F')
- update(1,0,n-1,l,r,2);
- else if ( c == 'E')
- update(1,0,n-1,l,r,3);
- else if ( c == 'I')
- update(1,0,n-1,l,r,1);
- else
- {
- int ans = query(1,0,n-1,l,r);
- cout << "Q"<<num << ": " << ans << endl;
- num ++;
- }
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment