def copy(n):return n.copy()if hasattr(n,"copy")else n def rec_str(a):return"".join(["[",", ".join(rec_str(x)for x in a),"]"])if isinstance(a,list)else str(a) class SegmentTree: e=(0,0,0) #User's definition def op(x,y): #User's definition lr=min(x[2],y[0]) return(x[0]+y[0]-lr,x[1]+y[1]+lr,x[2]+y[2]-lr) def __init__(self,x): b=isinstance(x,int) if b:self.N=x else:self.N=len(x) self.p=1 while self.N>self.p:self.p<<=1 if b:self.T=[copy(__class__.e)for i in R(self.p<<1)] else: self.T=[__class__.e]*(self.p<<1) for i in R(0,self.N):self.T[self.p|i]=copy(x[i]) for j in R(self.p-1,0,-1):self.T[j]=__class__.op(self.T[j<<1],self.T[(j<<1)|1]) def copy(self): a=__class__([]) a.N=self.N a.p=self.p a.T=copy(self.T) return a def Set(self,i,u): assert 0<=i>1 while j:self.T[j],j=__class__.op(self.T[j<<1],self.T[(j<<1)|1]),j>>1 def Get(self,i): assert 0<=i>1,r>>1 return __class__.op(a,b) R=range I=input J=lambda:map(int,I().split()) N,Q=J() def T(c):return(c==')',0,c=='(') X=SegmentTree([T(c)for c in I()]) for q in R(Q): t,l,r=J() if t<2:X.Set(l-1,T("()"[r-1])) else:print(X.IntervalProduct(l-1,r-1)[1]*2)