#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 2;
const int inf = 1e9 + 2;
string s;
struct node {
  int fr1, fr2, fr3, bk2, mid, deg;
};
node it[4 * N];
void init(int idx, int l, int r) {
  if (l == r) {
    if (s[l - 1] == '(') {
      it[idx].fr1 = 1;
      it[idx].deg = 1;
      it[idx].mid = -2;
      it[idx].fr2 = -1;
      it[idx].fr3 = 0;
      it[idx].bk2 = -1;
    } else {
      it[idx].fr1 = -1;
      it[idx].deg = -1;
      it[idx].mid = 2;
      it[idx].fr2 = 1;
      it[idx].fr3 = 0;
      it[idx].bk2 = 1;
    }
    return;
  }
  init(2 * idx, l, (l + r) / 2);
  init(2 * idx + 1, (l + r) / 2 + 1, r);
  it[idx].deg = it[2 * idx].deg + it[2 * idx + 1].deg;
  it[idx].fr1 = max(it[2 * idx].fr1, it[2 * idx + 1].fr1 + it[2 * idx].deg);
  it[idx].mid = max(it[2 * idx].mid, it[2 * idx + 1].mid - 2 * it[2 * idx].deg);
  if (r - l + 1 >= 2) {
    it[idx].fr2 =
        max(max(it[2 * idx].fr2, it[2 * idx + 1].fr2 - it[2 * idx].deg),
            it[2 * idx].fr1 + it[2 * idx + 1].mid - 2 * it[2 * idx].deg);
    it[idx].bk2 =
        max(max(it[2 * idx].bk2, it[2 * idx + 1].bk2 - it[2 * idx].deg),
            it[2 * idx].mid + it[2 * idx + 1].fr1 + it[2 * idx].deg);
  }
  if (r - l + 1 >= 3) {
    it[idx].fr3 =
        max(max(it[2 * idx].fr3, it[2 * idx + 1].fr3),
            max(it[2 * idx].fr1 + it[2 * idx + 1].bk2 - it[2 * idx].deg,
                it[2 * idx].fr2 + it[2 * idx + 1].fr1 + it[2 * idx].deg));
  }
}
void upd(int idx, int l, int r, int pos, int type) {
  if (l > pos || r < pos) {
    return;
  }
  if (l == r) {
    if (type == 1) {
      it[idx].fr1 = 1;
      it[idx].deg = 1;
      it[idx].mid = -2;
      it[idx].fr2 = -1;
      it[idx].fr3 = 0;
      it[idx].bk2 = -1;
    } else {
      it[idx].fr1 = -1;
      it[idx].deg = -1;
      it[idx].mid = 2;
      it[idx].fr2 = 1;
      it[idx].fr3 = 0;
      it[idx].bk2 = 1;
    }
    return;
  }
  upd(2 * idx, l, (l + r) / 2, pos, type);
  upd(2 * idx + 1, (l + r) / 2 + 1, r, pos, type);
  it[idx].deg = it[2 * idx].deg + it[2 * idx + 1].deg;
  it[idx].fr1 = max(it[2 * idx].fr1, it[2 * idx + 1].fr1 + it[2 * idx].deg);
  it[idx].mid = max(it[2 * idx].mid, it[2 * idx + 1].mid - 2 * it[2 * idx].deg);
  it[idx].fr2 =
      max(max(it[2 * idx].fr2, it[2 * idx + 1].fr2 - it[2 * idx].deg),
          it[2 * idx].fr1 + it[2 * idx + 1].mid - 2 * it[2 * idx].deg);
  it[idx].bk2 = max(max(it[2 * idx].bk2, it[2 * idx + 1].bk2 - it[2 * idx].deg),
                    it[2 * idx].mid + it[2 * idx + 1].fr1 + it[2 * idx].deg);
  it[idx].fr3 =
      max(max(it[2 * idx].fr3, it[2 * idx + 1].fr3),
          max(it[2 * idx].fr1 + it[2 * idx + 1].bk2 - it[2 * idx].deg,
              it[2 * idx].fr2 + it[2 * idx + 1].fr1 + it[2 * idx].deg));
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int q, n, i, j, k, l;
  cin >> n >> q;
  cin >> s;
  init(1, 1, 2 * n - 2);
  cout << it[1].fr3 << "\n";
  for (i = 1; i <= q; i++) {
    cin >> j >> k;
    if (s[k - 1] == '(') {
      upd(1, 1, 2 * n - 2, j, 1);
    } else {
      upd(1, 1, 2 * n - 2, j, 0);
    }
    if (s[j - 1] == '(') {
      upd(1, 1, 2 * n - 2, k, 1);
    } else {
      upd(1, 1, 2 * n - 2, k, 0);
    }
    swap(s[j - 1], s[k - 1]);
    cout << it[1].fr3 << "\n";
  }
}
