首页 > 代码库 > 1080 - Binary Simulation

1080 - Binary Simulation

1080 - Binary Simulation
   PDF (English)StatisticsForum
Time Limit: 2 second(s)Memory Limit: 64 MB

Given a binary number, we are about to do some operations on the number. Two types of operations can be here.

‘I i j‘    which means invert the bit from i to j (inclusive)

‘Q i‘    answer whether the ith bit is 0 or 1

The MSB (most significant bit) is the first bit (i.e. i=1). The binary number can contain leading zeroes.

Input

Input starts with an integer T (≤ 10), denoting the number of test cases.

Each case starts with a line containing a binary integer having length n (1 ≤ n ≤ 105). The next line will contain an integer q (1 ≤ q ≤ 50000) denoting the number of queries. Each query will be either in the form ‘I i j‘ where i, j are integers and 1 ≤ i ≤ j ≤ n. Or the query will be in the form ‘Q i‘ where i is an integer and 1 ≤ i ≤ n.

Output

For each case, print the case number in a single line. Then for each query ‘Q i‘ you have to print 1 or 0 depending on the ith bit.

Sample Input

Output for Sample Input

2

0011001100

6

I 1 10

I 2 7

Q 2

Q 1

Q 7

Q 5

1011110111

6

I 1 10

I 2 7

Q 2

Q 1

Q 7

Q 5

Case 1:

0

1

1

0

Case 2:

0

0

0

1

Note

Dataset is huge, use faster i/o methods.


PROBLEM SETTER: JANE ALAM JAN
思路:线段树;
线段树维护加反了多少次。
 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<string.h> 5 #include<queue> 6 #include<math.h> 7 using namespace std; 8 char str[100005]; 9 int tree[4*100005];10 void in(int l,int r,int k,int nn,int mm)11 {12     if(l>mm||r<nn)13     {14         return ;15     }16     else if(l<=nn&&r>=mm)17     {18         tree[k]++;19         tree[k]%=2;20         return ;21     }22     else23     {24         tree[2*k+1]+=tree[k];25         tree[2*k+1]%=2;26         tree[2*k+2]+=tree[k];27         tree[2*k+2]%=2;28         tree[k] = 0;29         in(l,r,2*k+1,nn,(nn+mm)/2);30         in(l,r,2*k+2,(nn+mm)/2+1,mm);31     }32 }33 int ask(int l,int r,int k,int nn,int mm)34 {35     if(l>mm||r<nn)36     {37         return 0;38     }39     else if(l<=nn&&r>=mm)40     {41         return tree[k];42     }43     else44     {45         tree[2*k+1]+=tree[k];46         tree[2*k+1]%=2;47         tree[2*k+2]+=tree[k];48         tree[2*k+2]%=2;49         tree[k] = 0;50         int nx = ask(l,r,2*k+1,nn,(nn+mm)/2);51         int ny = ask(l,r,2*k+2,(nn+mm)/2+1,mm);52         return (nx + ny)%2;53     }54 }55 int main(void)56 {57     int T;58     scanf("%d",&T);59     int __ca = 0;60     while(T--)61     {62         __ca++;63         printf("Case %d:\n",__ca);64         memset(tree,0,sizeof(tree));65         scanf("%s",str);66         int n;int l = strlen(str);67         scanf("%d ",&n);68         while(n--)69         {70             char a[10];71             int x,y;72             scanf("%s",a);73             if(a[0] == I)74             {scanf("%d %d",&x,&y);75              in(x-1,y-1,0,0,l-1);76             }77             else78             {79                 int x;80                 scanf("%d",&x);81                 int ny = ask(x-1,x-1,0,0,l-1);82                 printf("%d\n",(str[x-1]-0+ny)%2);83             }84         }85     }return 0;86 }

 

1080 - Binary Simulation