#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
const long long mod = 1e9 + 7;
const int inf = 1e9 + 10;
struct node {
  int a, b, ab, ba, lzy, res;
  node() { a = b = ab = ba = lzy = res = 0; }
};
int n;
string s;
node seg[8 * N];
node merge(node A, node B) {
  node C;
  C.a = max(A.a, B.a);
  C.b = min(A.b, B.b);
  C.ab = max({A.ab, B.ab, A.a - 2 * B.b});
  C.ba = max({A.ba, B.ba, B.a - 2 * A.b});
  C.lzy = 0;
  C.res = max({A.res, B.res, A.ab + B.a, A.a + B.ba});
  return C;
}
void add(int id, int x) {
  seg[id].a += x;
  seg[id].b += x;
  seg[id].ab += -x;
  seg[id].ba += -x;
  seg[id].lzy += x;
}
void shift(int id) {
  int x = seg[id].lzy;
  if (x == 0) return;
  add((2 * id), x);
  add((2 * id + 1), x);
  seg[id].lzy = 0;
}
void upd(int l, int r, int x, int s = 1, int e = 2 * n - 1, int id = 1) {
  if (e <= l || r <= s) return;
  if (l <= s && e <= r) {
    add(id, x);
    return;
  }
  shift(id);
  int mid = (s + e) / 2;
  upd(l, r, x, s, mid, (2 * id));
  upd(l, r, x, mid, e, (2 * id + 1));
  seg[id] = merge(seg[(2 * id)], seg[(2 * id + 1)]);
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int q;
  cin >> n >> q >> s;
  s = '.' + s;
  int cur = 0;
  for (int i = 1; i <= 2 * n - 2; i++) {
    cur += (s[i] == '(' ? 1 : -1);
    upd(i + 1, i + 2, cur);
  }
  cout << seg[1].res << '\n';
  while (q--) {
    int x, y;
    cin >> x >> y;
    if (y < x) swap(x, y);
    upd(x + 1, y + 1, (s[x] == '(' ? -2 : 2));
    swap(s[x], s[y]);
    cout << seg[1].res << '\n';
  }
  return 0;
}
