#include <bits/stdc++.h>
using namespace std;
typedef struct node {
  int d;
  int maxe;
  int mine;
  int r;
  int l;
  int f;
} Node;
int n, q, R = 1;
string s;
vector<int> t((int)(2e5 + 1));
Node T[(1 << 19)];
void update(int a) {
  T[a].d = T[a].maxe = T[a].mine = -T[a].d;
  T[a].r = T[a].l = -T[a].d;
  while (a > 1) {
    a /= 2;
    T[a].d = T[2 * a].d + T[2 * a + 1].d;
    T[a].maxe = max(T[2 * a].maxe, T[2 * a + 1].maxe + T[2 * a].d);
    T[a].mine = min(T[2 * a].mine, T[2 * a + 1].mine + T[2 * a].d);
    T[a].l = max(T[2 * a].l,
                 max(T[2 * a + 1].l - T[2 * a].d,
                     T[2 * a].maxe - 2 * T[2 * a + 1].mine - 2 * T[2 * a].d));
    T[a].r = max(T[2 * a].r,
                 max(T[2 * a + 1].r - T[2 * a].d,
                     T[2 * a + 1].maxe - 2 * T[2 * a].mine + T[2 * a].d));
    T[a].f = max(
        T[2 * a].f,
        max(T[2 * a + 1].f, max(T[2 * a].maxe + T[2 * a + 1].r - T[2 * a].d,
                                T[2 * a].l + T[2 * a + 1].maxe + T[2 * a].d)));
  }
}
int main(void) {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q >> s;
  while (R < 2 * (n - 1)) R *= 2;
  for (int i = 0; i < 2 * (n - 1); i++) {
    if (s[i] == '(') {
      t[i] = 1;
      T[i + R].d = -1;
      update(i + R);
    } else {
      t[i] = -1;
      T[i + R].d = 1;
      update(i + R);
    }
  }
  cout << T[1].f << "\n";
  for (int i = 0, a, b; i < q; i++) {
    cin >> a >> b;
    a--, b--;
    if (t[a] != t[b]) {
      t[a] = -t[a], t[b] = -t[b];
      update(a + R), update(b + R);
    }
    cout << T[1].f << "\n";
  }
  return 0;
}
