Problem: Example

Input

6 3
((()))
4
3
1


Output

2
2
1

Solution (in JAVA):

Solution:
import java.util.*;

public class Main {

	public static void main(String[] args){
		new Main().run();
	}
	void run() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int q = sc.nextInt();
		char[] in = sc.next().toCharArray();
		
		int[] a = new int[n];
		TreeSet<Integer> Q = new TreeSet<Integer>();
		
		for(int i = 0; i < n; i++){ //&#151;&#221;&#144;&#207;&#152;a&#139;&#129;&#130;&#223;&#130;&#233;
			a[i] = (i == 0 ? 0 : a[i - 1]) + (in[i] == '(' ? 1 : -1);
			if(in[i] == ')') Q.add(i); //&#149;&#194;&#130;¶&#138;&#135;&#140;&#202;&#130;&#204;&#136;&#202;&#146;u&#130;&#205;&#143;W&#141;&#135;&#130;&#197;&#130;&#224;&#130;&#193;&#130;&#196;&#130;&#353;&#130;&#173;&#129;@&#129;i&#141;&#237;&#143;&#156;&#129;A&#141;&#197;&#143;&#172;&#146;l&#130;&#204;&#142;&#230;&#147;&#376;&#130;&#240;&#145;&#172;&#130;&#173;&#130;&#181;&#130;&#339;&#130;&#162;&#130;&#169;&#130;&#231;&#129;j
		}
		
		RMQ rmq = new RMQ(n, a);
		
		while(q-- > 0){
			int p = sc.nextInt() - 1;
			if(in[p] == '('){
				Q.add(p);
				rmq.addQuery(p, n, -2);
				in[p] = ')';
				p = Q.pollFirst();
				rmq.addQuery(p, n, 2);
				in[p] = '(';
				System.out.println(p + 1);
			}
			else{
				rmq.addQuery(p, n, 2);
				in[p] = '(';
				Q.remove(p);
				p = rmq.findRightMostOne(0, n) + 1;
				rmq.addQuery(p, n, -2);
				in[p] = ')';
				Q.add(p);
				System.out.println(p + 1);
			}
		}
			
	}
	class RMQ{
		int n;
		int[] a;
		int[] bkt, add;
		int bktSize;
		
		RMQ(int n, int[] a){
			
			bktSize = Math.max(100, (int)Math.sqrt(n)); //&#131;o&#131;P&#131;b&#131;g&#130;&#204;&#131;T&#131;C&#131;Y&#130;&#205;&#130;&#376;&#130;&#162;&#130;&#339;&#130;&#162;sqrt(n)
			this.a = Arrays.copyOf(a, n);
			this.n = n;
			
			int bktNum = (n + bktSize - 1) / bktSize; //&#131;o&#131;P&#131;b&#131;g&#130;&#204;&#140;&#194;&#144;&#148;&#130;&#205;(n / &#131;T&#131;C&#131;Y)&#130;&#240;&#144;&#216;&#130;&#232;&#143;&#227;&#130;°
			
			bkt = new int[bktNum]; //&#131;o&#131;P&#131;b&#131;g&#147;&#224;&#130;&#204;&#141;&#197;&#143;&#172;&#146;l
			add = new int[bktNum]; //&#131;o&#131;P&#131;b&#131;g&#145;S&#145;&#204;&#130;&#201;&#145;&#171;&#130;&#181;&#130;&#339;&#146;l
			
			Arrays.fill(bkt, Integer.MAX_VALUE);
			for(int i = 0; i < n; i++){
				bkt[i / bktSize] = Math.min(bkt[i / bktSize], a[i]); //&#131;o&#131;P&#131;b&#131;g&#147;&#224;&#130;&#204;&#141;&#197;&#143;&#172;&#146;l&#130;&#240;&#140;v&#142;Z
			}
			//System.err.println("bktSize: " + bktSize + " bktNum: " + bktNum);
		}
		void addQuery(int l, int r, int val){
			
			//l&#145;&#8364;&#130;&#197;&#131;o&#131;P&#131;b&#131;g&#130;&#169;&#130;&#231;&#130;&#205;&#130;&#221;&#143;o&#130;&#196;&#130;&#162;&#130;&#233;&#149;&#148;&#149;&#170;&#130;&#201;&#140;&#194;&#149;&#202;&#130;&#201;&#145;&#171;&#130;&#183;
			//&#145;&#171;&#130;&#181;&#130;&#339;&#140;&#227;&#130;&#197;&#129;A&#130;&#187;&#130;&#204;&#149;&#148;&#149;&#170;&#130;&#204;&#131;o&#131;P&#131;b&#131;g&#130;&#376;&#130;&#175;&#141;&#197;&#143;&#172;&#146;l&#130;&#240;&#130;&#224;&#130;&#8364;&#136;&#234;&#147;x&#139;&#129;&#130;&#223;&#130;&#233;
			int b = l / bktSize;
			bkt[b] = Integer.MAX_VALUE;
			for(; l < r && l % bktSize > 0; l++) a[l] += val;
			for(int i = b * bktSize; i < n && i < (b + 1) * bktSize; i++) bkt[b] = Math.min(bkt[b], a[i]);
			
			//r&#145;&#8364;&#130;&#197;&#131;o&#131;P&#131;b&#131;g&#130;&#169;&#130;&#231;&#130;&#205;&#130;&#221;&#143;o&#130;&#196;&#130;&#162;&#130;&#233;&#149;&#148;&#149;&#170;&#130;&#201;&#140;&#194;&#149;&#202;&#130;&#201;&#145;&#171;&#130;&#183;
			if(r % bktSize > 0){
				b = r / bktSize;
				bkt[b] = Integer.MAX_VALUE;
				for(; l < r && r % bktSize > 0; ) a[--r] += val;
				for(int i = b * bktSize; i < n && i < (b + 1) * bktSize; i++) bkt[b] = Math.min(bkt[b], a[i]);
			}
			
			//&#131;o&#131;P&#131;b&#131;g&#130;&#204;&#147;&#224;&#149;&#148;&#130;&#201;&#147;&#252;&#130;&#193;&#130;&#196;&#130;&#162;&#130;&#233;&#149;&#148;&#149;&#170;&#130;&#205;&#136;&#234;&#139;C&#130;&#201;&#145;&#171;&#130;&#183;
			l /= bktSize; r /= bktSize;
			for(; l < r; l++) add[l] += val;
			
			//for(int i = 0; i < n; i++) System.err.print(a[i] + (i == n - 1 ? "\n" :" "));
			
		}
		int findRightMostOne(int l, int r){ //&#136;&#234;&#148;&#212;&#137;E&#130;&#204;1&#130;&#204;&#146;l&#130;&#240;&#139;&#129;&#130;&#223;&#130;&#233;
			//r&#130;&#204;&#145;&#8364;&#130;&#197;&#131;o&#131;P&#131;b&#131;g&#130;&#169;&#130;&#231;&#130;&#205;&#130;&#221;&#143;o&#130;&#196;&#130;&#162;&#130;&#233;&#149;&#148;&#149;&#170;
			for(; l < r && r % bktSize > 0; ){
				--r;
				if(a[r] + add[r / bktSize] == 1) return r;
			}
			//&#131;o&#131;P&#131;b&#131;g&#130;&#240;&#137;E&#130;&#169;&#130;&#231;&#140;&#169;&#130;&#196;&#130;&#162;&#130;&#173;
			r /= bktSize;
			for(int b = l / bktSize; b < r; ){
				--r;
				if(bkt[r] + add[r] > 1) continue;
				
				//&#131;o&#131;P&#131;b&#131;g&#130;&#204;&#146;&#134;&#130;&#201;&#130;&#160;&#130;&#233;&#130;&#204;&#130;&#197;&#146;T&#130;&#183;&#129;B
				for(int i = (r + 1) * bktSize - 1; i >= r * bktSize; i--)
					if(a[i] + add[r] == 1) return i;
			}
			//&#130;&#140;&#130;&#204;&#145;&#8364;&#130;&#197;&#131;o&#131;P&#131;b&#131;g&#130;&#169;&#130;&#231;&#130;&#205;&#130;&#221;&#143;o&#130;&#196;&#130;&#162;&#130;&#233;&#149;&#148;&#149;&#170;&#129;i&#136;&#234;&#148;&#212;&#137;E&#130;&#204;&#130;&#240;&#139;&#129;&#130;&#223;&#130;&#339;&#130;&#162;&#130;&#204;&#130;&#197;&#137;E&#130;&#169;&#130;&#231;&#140;&#169;&#130;&#196;&#130;&#162;&#130;&#173;&#129;j
			r *= bktSize;
			for(; l < r; ){
				--r;
				if(a[r] + add[r / bktSize] == 1) return r;
			}
			return Integer.MAX_VALUE;
			
		}
	}

}