#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 7;
int n, q;
namespace Sgt {
struct seg {
  int a, b, c, d, e, lz;
} sgt[maxn * 4];
void init() { memset(sgt, 0, sizeof(sgt)); }
seg merge(seg x, seg y) {
  seg ret;
  ret.a = max(x.a, y.a);
  ret.b = max(max(x.b, y.b), x.a - 2 * y.d);
  ret.c = max(max(x.c, y.c), max(x.a + y.e, x.b + y.a));
  ret.d = min(x.d, y.d);
  ret.e = max(max(x.e, y.e), -2 * x.d + y.a);
  ret.lz = 0;
  return ret;
}
void pushup(int o) { sgt[o] = merge(sgt[o << 1], sgt[o << 1 | 1]); }
void pushdown(int o) {
  if (sgt[o].lz) {
    sgt[o << 1].a += sgt[o].lz;
    sgt[o << 1].b -= sgt[o].lz;
    sgt[o << 1].d += sgt[o].lz;
    sgt[o << 1].e -= sgt[o].lz;
    sgt[o << 1].lz += sgt[o].lz;
    sgt[o << 1 | 1].a += sgt[o].lz;
    sgt[o << 1 | 1].b -= sgt[o].lz;
    sgt[o << 1 | 1].d += sgt[o].lz;
    sgt[o << 1 | 1].e -= sgt[o].lz;
    sgt[o << 1 | 1].lz += sgt[o].lz;
    sgt[o].lz = 0;
  }
}
void update(int l, int r, int val, int L = 1, int R = n, int o = 1) {
  if (l <= L && r >= R) {
    sgt[o].a += val;
    sgt[o].b -= val;
    sgt[o].d += val;
    sgt[o].e -= val;
    sgt[o].lz += val;
    return;
  }
  pushdown(o);
  int mid = L + R >> 1;
  if (l <= mid) update(l, r, val, L, mid, o << 1);
  if (r > mid) update(l, r, val, mid + 1, R, o << 1 | 1);
  pushup(o);
  ;
}
};  // namespace Sgt
int main() {
  cin >> n >> q;
  n = (n - 1) * 2;
  string s;
  cin >> s;
  Sgt::init();
  for (int i = 0; i < s.length(); i++) {
    if (s[i] == '(')
      Sgt::update(i + 1, n, 1);
    else
      Sgt::update(i + 1, n, -1);
  }
  cout << Sgt::sgt[1].c << endl;
  while (q--) {
    int l, r;
    cin >> l >> r;
    if (l > r) swap(l, r);
    if (s[l - 1] != s[r - 1]) {
      if (s[l - 1] == '(')
        Sgt::update(l, r - 1, -2);
      else
        Sgt::update(l, r - 1, 2);
      swap(s[l - 1], s[r - 1]);
    }
    cout << Sgt::sgt[1].c << endl;
  }
}
