#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 250005;
string s;
struct node {
  int dep;
  int mx;
  int mi;
  int lmx;
  int rmx;
  int ans;
} t[800005];
void pushup(int x) {
  t[x].dep = t[x << 1].dep + t[x << 1 | 1].dep;
  t[x].mx = max(t[x << 1].mx, t[x << 1 | 1].mx + t[x << 1].dep);
  t[x].mi = min(t[x << 1].mi, t[x << 1 | 1].mi + t[x << 1].dep);
  t[x].lmx = max(t[x << 1].lmx, t[x << 1 | 1].lmx - t[x << 1].dep);
  t[x].lmx =
      max(t[x].lmx, t[x << 1].mx - 2 * (t[x << 1 | 1].mi + t[x << 1].dep));
  t[x].rmx = max(t[x << 1].rmx, t[x << 1 | 1].rmx - t[x << 1].dep);
  t[x].rmx =
      max(t[x].rmx, (t[x << 1 | 1].mx + t[x << 1].dep) - 2 * t[x << 1].mi);
  t[x].ans = max(t[x << 1].ans, t[x << 1 | 1].ans);
  t[x].ans =
      max(t[x].ans, max(t[x << 1].lmx + t[x << 1 | 1].mx + t[x << 1].dep,
                        t[x << 1 | 1].rmx - t[x << 1].dep + t[x << 1].mx));
}
void update(int x, int l, int r, int p) {
  if (l == r) {
    int c;
    if (s[l] == '(') {
      s[l] = ')';
      c = -1;
    } else {
      s[l] = '(';
      c = 1;
    }
    t[x] = {c, c, c, -c, -c, 0};
    return;
  }
  int mid = (l + r) >> 1;
  if (p <= mid)
    update(x << 1, l, mid, p);
  else
    update(x << 1 | 1, mid + 1, r, p);
  pushup(x);
}
void build(int x, int l, int r) {
  if (l == r) {
    int c;
    if (s[l] == '(') {
      c = 1;
    } else {
      c = -1;
    }
    t[x] = {c, c, c, -c, -c, 0};
    return;
  }
  int mid = (l + r) >> 1;
  build(x << 1, l, mid);
  build(x << 1 | 1, mid + 1, r);
  pushup(x);
}
void go() {
  int n, m;
  cin >> n >> m;
  cin >> s;
  s = " " + s;
  n = (n - 1) << 1;
  build(1, 1, n);
  cout << t[1].ans << '\n';
  while (m--) {
    int x, y;
    cin >> x >> y;
    if (s[x] == s[y]) {
    } else {
      update(1, 1, n, x);
      update(1, 1, n, y);
    }
    cout << t[1].ans << '\n';
    ;
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int c = 0;
  int t;
  if (!c) {
    t = 1;
  } else {
    cin >> t;
  }
  while (t--) {
    go();
  }
}
