#include <bits/stdc++.h>
using namespace std;
struct Info {
  int lz;
  int ab;
  int bc;
  int res;
  int mi;
  int ma;
  Info() { lz = ab = bc = res = mi = ma = 0; }
  Info(const Info& l, const Info& r) {
    ab = max(max(l.ab, r.ab), l.ma - 2 * r.mi);
    bc = max(max(l.bc, r.bc), r.ma - 2 * l.mi);
    res = max(max(l.res, r.res), max(l.ma + r.bc, l.ab + r.ma));
    ma = max(l.ma, r.ma);
    mi = min(l.mi, r.mi);
  }
  void add(int d) {
    lz += d;
    ab -= d;
    bc -= d;
    mi += d;
    ma += d;
  }
};
struct Node {
  Node* l = nullptr;
  Node* r = nullptr;
  int sz;
  Info info;
  Node(int _sz) : sz(_sz) {
    if (sz == 1) {
      return;
    }
    l = new Node(sz / 2);
    r = new Node(sz - sz / 2);
  }
  void add(int a, int b, int d) {
    if (b <= 0 || sz <= a) {
      return;
    }
    if (a <= 0 && sz <= b) {
      info.add(d);
      return;
    }
    l->info.add(info.lz);
    r->info.add(info.lz);
    info.lz = 0;
    l->add(a, b, d);
    r->add(a - sz / 2, b - sz / 2, d);
    info = Info(l->info, r->info);
  }
};
const int N = 233333;
int n, m;
char buf[N];
int a[N];
int main() {
  scanf("%d %d", &n, &m);
  n = 2 * (n - 1);
  scanf("%s", buf);
  Node* tr = new Node(n);
  for (int i = 0; i < n; i++) {
    if (buf[i] == '(') {
      a[i] = 2;
      tr->add(i, n, 1);
    } else {
      a[i] = -2;
      tr->add(i, n, -1);
    }
  }
  printf("%d\n", tr->info.res);
  for (int i = 0; i < m; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    x--;
    y--;
    swap(a[x], a[y]);
    tr->add(x, n, a[x]);
    tr->add(y, n, a[y]);
    printf("%d\n", tr->info.res);
  }
}
