Light oj 1080 - Binary Simulation 【树状数组】

 

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.

思路:
看到了RMQ,用数状数组或者线段树进行维护。利用树状数组的快速区间求和维护,将每个点的反转次数进进行记录,奇数次后肯定的发生改变,偶数次就不用进行改变。

 

没有注意树状数组的上界限n,导致n次WA,我现在只想要脑残片

#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <iostream>
#include <stack>
#include <cmath>
#include <string>
#include <vector>
#include <cstdlib>
//#include <bits/stdc++.h>
//#define LOACL
#define space " "
using namespace std;
//typedef long long LL;
//typedef __int64 Int;
typedef pair<int, int> paii;
const int INF = 0x3f3f3f3f;
const double ESP = 1e-5;
const double PI = acos(-1.0);
const int MOD = 1e9 + 7;
const int MAXN = 100000 + 10;
int lowbit(int x) {return x&(-x);}
int n, bit[MAXN];
char str[MAXN], s[3];
int sum(int x) {
    int s = 0;
    while (x > 0) {
        s += bit[x];
        x -= lowbit(x);
    }
    return s;
}
void add(int x, int y) {
    while (x <= n) {
        bit[x] += y;
        x  += lowbit(x);
    }
}
int main() {
    int T, a, b, p;
    int Kcase = 0;
    scanf("%d", &T);
    while (T--) {
        scanf("%s", str + 1);
        scanf("%d", &p); str[0] = '1';
        n = strlen(str) - 1;
        printf("Case %d:\n", ++Kcase);
        memset(bit, 0, sizeof(bit));
        while (p--) {
            scanf("%s", s);
            if (s[0] == 'I') {
                scanf("%d%d", &a, &b);
                add(a, -1);
                add(b + 1, 1);
            }
            else {
                scanf("%d", &a);
                if (sum(a) & 1) printf("%d\n", !(str[a] - '0'));
                else printf("%d\n", (str[a] - '0'));
            }
        }
     }
    return 0;
}

 

 



 

posted @ 2016-10-03 10:42  zprhhs  阅读(154)  评论(0编辑  收藏  举报
Power by awescnb