"Changing Bits" challenge
The trick to this challenge is to actually change the number into bit operations, and not to do string manipulation as you do. So here are some hints on how to do this to get you started:


Convert a binary string, text, of 0's and 1's into an int, use int(text, 2)
To clear a bit at a given offset, use n &amp; ~(1 &lt;&lt; offset)
To set a bit at a given offset, use n | (1 &lt;&lt; offset) 
To get a bit at a given offset (shifted down again to one bit), use (n &amp; (1 &lt;&lt; offset)) &gt;&gt; offset)


Combine these, and you'll get a fast enough solution.

Style review of current code

Some tips according to PEP8:


Use lower_snake_case for variable and function names -  This looks a little better, and wouldn't throw off the syntax highlighter here on Code Review either... :-)
Add a little vertical space in your code – Add two blank lines between functions, and add a blank line in natural segments within functions, like before if, else, for and while. 
Put all top level code in a main() function – Try to only keep imports, constants and functions at the top level, and start your code using a if __name__ == '__main__':' followed bymain()`
Start using the print function, and str.format'ing– The % syntax will disappear some time, so start using the newer string formatting options already available.
For Python 2 and large \$n\$'s use xrange() in for loops – Using range() will create the entire list, whilst xrange() will create a generator, and only give you one element at a time. For large numbers this has a noticeable effect on memory and time performance
No need to create a list for join() – Instead of ''.join([ ... ]), you can simply use ''.join( ... ). The latter uses a generator instead of a list, similar to the range() vs xrange()


Refactored code running within time limit

So as not to spoil the fun for those wanting to solve this challenge by themselves, I've chosen to have the code hidden beneath a spoiler. That is if you hover over the block below you'll see the code. 


  def getBit(n, offset):
    return (n &amp; (1 &lt;&lt; offset)) >> offset

def clearBit(n, offset):
    return n &amp; ~(1 &lt;&lt; offset)

def setBit(n, offset):
    return n | (1 &lt;&lt; offset)

def changing_bits_challenge():

    n, q = map(int, raw_input().split())
    a = int(raw_input(), 2)
    b = int(raw_input(), 2)

    c = []
    for _ in xrange(q):
        words = raw_input().split()
        operator = words[0][4]
        bit_number = int(words[1])

        if operator == 'c':
            c.append(getBit(a+b, bit_number))

        if operator == 'a':
            a = clearBit(a, bit_number) if words[2] == '0' 
                else setBit(a, bit_number)

        if operator == 'b':
            b = clearBit(b, bit_number) if words[2] == '0'
                else setBit(b, bit_number)

    print ''.join(str(i) for i in c)

changing_bits_challenge()