#include <bits/stdc++.h>
using namespace std;
const int maxn = 212345;
const int inf = 0x3f3f3f3f;
int n, q, tot, sum[maxn];
char s[maxn];
struct node {
  int Max, Min, pre, suf, val, lz;
  inline void update(int tv) {
    lz += tv;
    Max += tv;
    Min += tv;
    pre -= tv;
    suf -= tv;
  }
} seg[maxn << 2];
inline void pushup(int x) {
  seg[x].Max = max(seg[x << 1].Max, seg[x << 1 | 1].Max);
  seg[x].Min = min(seg[x << 1].Min, seg[x << 1 | 1].Min);
  seg[x].pre = max(seg[x << 1].pre, seg[x << 1 | 1].pre);
  seg[x].pre = max(seg[x].pre, seg[x << 1].Max - 2 * seg[x << 1 | 1].Min);
  seg[x].suf = max(seg[x << 1].suf, seg[x << 1 | 1].suf);
  seg[x].suf = max(seg[x].suf, -2 * seg[x << 1].Min + seg[x << 1 | 1].Max);
  seg[x].val = max(seg[x << 1].val, seg[x << 1 | 1].val);
  seg[x].val = max(seg[x].val, seg[x << 1].pre + seg[x << 1 | 1].Max);
  seg[x].val = max(seg[x].val, seg[x << 1].Max + seg[x << 1 | 1].suf);
}
inline void pushdown(int x) {
  int lz = seg[x].lz;
  if (lz != 0) {
    seg[x << 1].lz += lz;
    seg[x << 1].Max += lz;
    seg[x << 1].Min += lz;
    seg[x << 1].pre -= lz;
    seg[x << 1].suf -= lz;
    seg[x << 1 | 1].lz += lz;
    seg[x << 1 | 1].Max += lz;
    seg[x << 1 | 1].Min += lz;
    seg[x << 1 | 1].pre -= lz;
    seg[x << 1 | 1].suf -= lz;
  }
  seg[x].lz = 0;
}
void build(int x, int l, int r) {
  if (l == r) {
    seg[x].Max = seg[x].Min = sum[l];
    seg[x].pre = seg[x].suf = seg[x].val = -inf;
    return;
  }
  int m = (l + r) >> 1;
  build(x << 1, l, m);
  build(x << 1 | 1, m + 1, r);
  pushup(x);
}
void update(int x, int L, int R, int l, int r, int v) {
  if (l <= L && r >= R) {
    seg[x].update(v);
    return;
  }
  pushdown(x);
  int m = (L + R) >> 1;
  if (m >= l) update(x << 1, L, m, l, r, v);
  if (m < r) update(x << 1 | 1, m + 1, R, l, r, v);
  pushup(x);
}
int main() {
  scanf("%d%d%s", &n, &q, s + 1);
  tot = n + n - 2;
  for (int i = 1; i <= tot; ++i)
    if (s[i] == '(')
      sum[i] = sum[i - 1] + 1;
    else
      sum[i] = sum[i - 1] - 1;
  build(1, 1, tot);
  printf("%d\n", max(seg[1].Max, seg[1].val));
  while (q--) {
    int l, r;
    scanf("%d%d", &l, &r);
    if (l > r) swap(l, r);
    char ch1 = s[l], ch2 = s[r];
    if (ch1 == '(')
      update(1, 1, tot, l, r - 1, -2);
    else
      update(1, 1, tot, l, r - 1, 2);
    s[l] = ch2;
    s[r] = ch1;
    printf("%d\n", max(seg[1].Max, seg[1].val));
  }
  return 0;
}
