#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
struct TRes {
  int bal;
  int ans, ansp, anss, anssp;
  int maxpref, maxsuf;
  int minpref, minsuf;
  int maxpos, minneg;
  TRes operator+(const TRes &r) const {
    TRes res;
    res.bal = bal + r.bal;
    res.maxpref = max(maxpref, bal + r.maxpref);
    res.minpref = min(minpref, bal + r.minpref);
    res.maxsuf = max(r.maxsuf, r.bal + maxsuf);
    res.minsuf = min(r.minsuf, r.bal + minsuf);
    res.maxpos = max({maxpos, r.maxpos, maxsuf + r.maxpref});
    res.minneg = min({minneg, r.minneg, minsuf + r.minpref});
    res.anssp = max({-bal + r.anssp, -minpref + r.maxsuf, anssp + r.bal});
    res.ansp =
        max({-bal + r.ansp, -minpref + r.maxpos, anssp + r.maxpref, ansp});
    res.anss =
        max({r.anss, -minsuf + r.anssp, -minneg + r.maxsuf, anss + r.bal});
    res.ans = max(
        {r.ans, -minsuf + r.ansp, -minneg + r.maxpos, anss + r.maxpref, ans});
    return res;
  };
  TRes(int x = 1) {
    if (x == 1) {
      bal = ans = ansp = anss = anssp = 1;
      maxpref = maxsuf = maxpos = 1;
      minpref = minsuf = minneg = 0;
    } else {
      bal = -1;
      ans = ansp = anss = anssp = 1;
      maxpref = maxsuf = maxpos = 0;
      minpref = minsuf = minneg = -1;
    }
  }
};
struct TNode {
  int L, R;
  int l, r;
  TRes res;
};
const int maxn = 210000, maxt = 2 * maxn;
TNode t[maxt];
int tc = 0;
string s;
int buildTree(int L, int R) {
  int node = tc++;
  TNode &n = t[node];
  n.L = L;
  n.R = R;
  if (R - L == 1)
    n.res = TRes(s[L] == '(' ? 1 : -1);
  else {
    int M = (L + R) / 2;
    n.l = buildTree(L, M);
    n.r = buildTree(M, R);
    n.res = t[n.l].res + t[n.r].res;
  }
  return node;
}
void change(int node, int i, int x) {
  TNode &n = t[node];
  if (i < n.L || i >= n.R) return;
  if (n.R - n.L == 1)
    n.res = TRes(x);
  else {
    change(n.l, i, x);
    change(n.r, i, x);
    n.res = t[n.l].res + t[n.r].res;
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  int n, q;
  cin >> n >> q;
  cin >> s;
  buildTree(0, s.size());
  cout << t[0].res.ans << '\n';
  for (int i = 0; i < (int)(q); ++i) {
    int p, q;
    cin >> p >> q;
    --p;
    --q;
    swap(s[p], s[q]);
    change(0, p, s[p] == '(' ? 1 : -1);
    change(0, q, s[q] == '(' ? 1 : -1);
    cout << t[0].res.ans << '\n';
  }
  return 0;
}
