#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
const int MAXN = 300010;
const int MAX = 10000000;
set<int> r;
char s[MAXN];
int a[MAXN];
PII b[4];
struct node{
    int l, r, tag;
    PII min,smin;
} tree[4*MAXN];
bool cmp(PII x, PII y){
    if(x.first < y.first || (x.first == y.first && x.second > y.second)) return true;
    else return false;
}
void update(int v){
    b[0] = PII(tree[v << 1].min.first+tree[v << 1].tag,tree[v << 1].min.second);
    b[1] = PII(tree[v << 1].smin.first+tree[v << 1].tag,tree[v << 1].smin.second);
    b[2] = PII(tree[v << 1 | 1].min.first+tree[v << 1 | 1].tag,tree[v << 1 | 1].min.second);
    b[3] = PII(tree[v << 1 | 1].smin.first+tree[v << 1 | 1].tag,tree[v << 1 | 1].smin.second);
    sort(b, b + 4, cmp);
    tree[v].min = b[0];
    int i = 1;
    while(i < 4 && b[i].first == b[i-1].first) i++;
    if(i < 4) tree[v].smin = b[i];
    else tree[v].smin = PII(MAX,MAX);
}
void build(int v, int l, int r){
    tree[v].l = l;
    tree[v].r = r; 
    tree[v].tag = 0;
    tree[v].min = PII(0, r);
    tree[v].smin = PII(MAX, MAX);
    if(l == r) {
        tree[v].tag = a[l];
        return;
    }
    int mid = (l + r) >> 1;
    build(v << 1, l, mid);
    build(v << 1 | 1, mid+1, r);
    update(v);
}
void add(int v, int l, int r, int x){
    if(l > r) return;
    if(l <= tree[v].l && tree[v].r <= r){
        tree[v].tag += x;
        return;
    }
    if(tree[v].tag){
        tree[v << 1].tag += tree[v].tag;
        tree[v << 1 | 1].tag += tree[v].tag;
        tree[v].tag = 0;
    }
    int mid = (tree[v].l+tree[v].r)>>1;
    if(l <= mid) add(v << 1, l, r, x);
    if(r > mid) add(v << 1 | 1, l, r, x);
    update(v);
}    
int ask(int v, int l, int r){
    int ret = 0;
    if(l <= tree[v].l && tree[v].r <= r){
        int tmp1 = tree[v].min.first + tree[v].tag;
        int tmp2 = tree[v].smin.first + tree[v].tag;
        if(tmp1 <= 1) ret = tree[v].min.second;
        if(tmp2 <= 1) ret = max(ret, tree[v].smin.second);
        return ret;
    } 
    if(tree[v].tag){
        tree[v].min.first += tree[v].tag;
        tree[v].smin.first += tree[v].tag;
        tree[v << 1].tag += tree[v].tag;
        tree[v << 1 | 1].tag += tree[v].tag;
        tree[v].tag = 0;
    }
    int ll = 0, rr = 0;
    int mid =(tree[v].l+tree[v].r)>>1;
    if(l <= mid) ll = ask(v << 1, l, r);
    if(r > mid) rr = ask(v << 1 | 1, l, r);
    return max(ll, rr);
}
int main(){
    int n, q;
    scanf("%d%d", &n, &q);
    scanf("%s", s + 1);
    a[0] = 0;
    for(int i = 1; i <= n; i++){
        if(s[i] == '(') {
            a[i] = a[i-1] + 1;
        }
        else {
            r.insert(i);
            a[i] = a[i-1] - 1;
        } 
    }
    build(1, 1, n);
    for(int i = 1; i <= q; i++){
        int x;
         scanf("%d", &x);
         if(s[x] == '('){
             r.insert(x);
             int ll = *r.begin();
             printf("%d\n", ll);
             s[x] = ')';
             s[ll] = '(';
             r.erase(r.begin());
             add(1, ll, x - 1, 2);
         }else{
             r.erase(x);
             int rr = ask(1, 1, x - 1);
             int ll = rr + 1;
             printf("%d\n", ll);
             s[x] = '(';
             s[ll] = ')';
             r.insert(ll);
             add(1, ll, x - 1, -2);
         }
    }
    return 0;
}
