#include <bits/stdc++.h>
using namespace std;
template <typename T>
T MAX(T a, T b) {
  return (a > b) ? a : b;
}
template <typename T>
T MIN(T a, T b) {
  return (a < b) ? a : b;
}
template <typename T>
void UMAX(T &a, T b) {
  a = (a > b ? a : b);
}
template <typename T>
void UMIN(T &a, T b) {
  a = (a < b ? a : b);
}
int readint() {
  char c = getchar();
  int ret = 0;
  while (!(c >= '0' && c <= '9')) c = getchar();
  while (c >= '0' && c <= '9') {
    ret = ret * 10 + c - '0';
    c = getchar();
  }
  return ret;
}
void putint(int v) {
  if (!v) {
    putchar('0');
    return;
  }
  if (v >= 10) putint(v / 10);
  putchar('0' + (v % 10));
}
int n, q;
struct data {
  int f[3][3];
  void init(int v) {
    f[0][0] = f[2][2] = v;
    f[1][1] = -v * 2;
    f[0][1] = f[1][2] = -v;
    f[0][2] = 0;
  }
  void add(int v) {
    f[0][0] += v;
    f[1][1] -= v * 2;
    f[2][2] += v;
    f[0][1] -= v;
    f[1][2] -= v;
  }
};
data mrg(data L, data R) {
  data ret;
  int i, j, k;
  for (i = 0; i < 3; ++i) {
    for (j = i; j < 3; ++j) {
      ret.f[i][j] = max(L.f[i][j], R.f[i][j]);
      for (k = i; k < j; ++k) {
        UMAX(ret.f[i][j], L.f[i][k] + R.f[k + 1][j]);
      }
    }
  }
  return ret;
}
int t[200005], inid[200005];
namespace segT {
data arr[800015];
int dlt[800015];
void build(int p, int l = 0, int r = n) {
  dlt[p] = 0;
  if (l == r) {
    arr[p].init(inid[l]);
    return;
  }
  int M = (l + r) / 2;
  build(p << 1, l, M);
  build(p << 1 | 1, M + 1, r);
  arr[p] = mrg(arr[p << 1], arr[p << 1 | 1]);
}
void push(int p, int l = 0, int r = n) {
  if (dlt[p]) {
    arr[p].add(dlt[p]);
    if (l < r) {
      dlt[p << 1] += dlt[p];
      dlt[p << 1 | 1] += dlt[p];
    }
    dlt[p] = 0;
  }
}
void add(int p, int L, int R, int v, int l = 0, int r = n) {
  if (l >= L && r <= R) {
    dlt[p] += v;
    push(p, l, r);
    return;
  }
  push(p, l, r);
  int M = (l + r) / 2;
  if (L <= M)
    add(p << 1, L, R, v, l, M);
  else
    push(p << 1, l, M);
  if (R > M)
    add(p << 1 | 1, L, R, v, M + 1, r);
  else
    push(p << 1 | 1, M + 1, r);
  arr[p] = mrg(arr[p << 1], arr[p << 1 | 1]);
}
}  // namespace segT
char readch() {
  char c = getchar();
  while (c != '(' && c != ')') c = getchar();
  return c;
}
int main() {
  int i, j, k;
  scanf("%d%d", &n, &q);
  n = n * 2 - 2;
  for (i = 0; i < n; ++i) {
    t[i] = (readch() == '(' ? 1 : -1);
    inid[i + 1] = inid[i] + t[i];
  }
  segT::build(1);
  printf("%d\n", segT::arr[1].f[0][2]);
  while (q--) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a;
    --b;
    if (a > b) swap(a, b);
    if (a < b && t[a] != t[b]) {
      segT::add(1, a + 1, b, t[a] == 1 ? -2 : 2);
    }
    swap(t[a], t[b]);
    segT::push(1);
    printf("%d\n", segT::arr[1].f[0][2]);
  }
  return 0;
}
