#include <bits/stdc++.h>
using namespace std;
const int MX = 200100;
int N, M;
char S[MX];
int A[MX];
struct Segment {
  int a, b, c, d, e;
  int z, l, r;
  void add(int x) { a += x, b += x, c -= x, d -= x, z += x; }
} T[MX << 2];
inline void PushUp(int i) {
  Segment &t = T[i], &x = T[(i << 1)], &y = T[(i << 1 | 1)];
  t.a = max(x.a, y.a);
  t.b = min(x.b, y.b);
  t.c = max(max(x.c, y.c), x.a - 2 * y.b);
  t.d = max(max(x.d, y.d), y.a - 2 * x.b);
  t.e = max(max(x.e, y.e), max(x.c + y.a, x.a + y.d));
}
inline void PushDown(int i) {
  if (T[i].z) T[(i << 1)].add(T[i].z), T[(i << 1 | 1)].add(T[i].z), T[i].z = 0;
}
void Build(int i, int l, int r) {
  T[i].l = l, T[i].r = r;
  if (l == r) {
    T[i].a = T[i].b = A[l], T[i].c = T[i].d = -A[l];
    return;
  }
  int m = (l + r) >> 1;
  Build((i << 1), l, m), Build((i << 1 | 1), m + 1, r);
  PushUp(i);
}
void Add(int i, int a, int b, int x) {
  if (a <= T[i].l && T[i].r <= b) {
    T[i].add(x);
    return;
  }
  PushDown(i);
  if (a <= T[(i << 1)].r) Add((i << 1), a, b, x);
  if (b >= T[(i << 1 | 1)].l) Add((i << 1 | 1), a, b, x);
  PushUp(i);
}
int main() {
  int n;
  scanf("%d%d%s", &n, &M, S + 1), N = strlen(S + 1);
  for (int i = (1); i <= (N); ++i) A[i] = A[i - 1] + (S[i] == '(' ? 1 : -1);
  Build(1, 0, N);
  printf("%d\n", T[1].e);
  for (int i = (1); i <= (M); ++i) {
    int l, r;
    scanf("%d%d", &l, &r);
    if (l > r) swap(l, r);
    if (S[l] != S[r]) Add(1, l, r - 1, S[l] == '(' ? -2 : 2), swap(S[l], S[r]);
    printf("%d\n", T[1].e);
  }
  return 0;
}
