#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
int n, q;
char s[200005];
struct node {
  int a, b, l1, l2, r1, r2, dis;
  inline void init(char x) {
    a = b = 0, dis = -inf;
    l1 = r1 = 1;
    if (x == '(')
      b = 1, l2 = 1, r2 = 0;
    else if (x == ')')
      a = 1, r2 = 1, l2 = 0;
  }
} t[200005 << 2];
void upd(int i) {
  int lc = i << 1, rc = i << 1 | 1;
  if (t[lc].b > t[rc].a)
    t[i].a = t[lc].a, t[i].b = t[lc].b - t[rc].a + t[rc].b;
  else
    t[i].a = t[lc].a + t[rc].a - t[lc].b, t[i].b = t[rc].b;
  t[i].dis = max(max(t[lc].r1 + t[rc].l2, t[lc].r2 + t[rc].l1),
                 max(t[lc].dis, t[rc].dis));
  t[i].l1 = max(t[lc].l1, max(t[lc].a + t[lc].b + t[rc].l2,
                              t[lc].a - t[lc].b + t[rc].l1));
  t[i].l2 = max(t[lc].l2, t[lc].b - t[lc].a + t[rc].l2);
  t[i].r1 = max(t[rc].r1, max(t[rc].a + t[rc].b + t[lc].r2,
                              t[rc].b - t[rc].a + t[lc].r1));
  t[i].r2 = max(t[rc].r2, t[rc].a - t[rc].b + t[lc].r2);
}
void build(int i, int l, int r) {
  if (l == r) {
    t[i].init(s[l]);
    return;
  }
  int mid = (l + r) >> 1;
  build(i << 1, l, mid), build(i << 1 | 1, mid + 1, r);
  upd(i);
}
void insert(int i, int l, int r, int x) {
  if (l == r) {
    t[i].init(s[l]);
    return;
  }
  int mid = (l + r) >> 1;
  if (x <= mid)
    insert(i << 1, l, mid, x);
  else
    insert(i << 1 | 1, mid + 1, r, x);
  upd(i);
}
int main() {
  scanf("%d%d%s", &n, &q, s + 1), n = (n - 1) << 1;
  build(1, 1, n);
  printf("%d\n", t[1].dis);
  while (q--) {
    int x, y;
    scanf("%d%d", &x, &y), swap(s[x], s[y]);
    insert(1, 1, n, x), insert(1, 1, n, y);
    printf("%d\n", t[1].dis);
  }
}
