/*
*************************************************************************
* $ Author : honeyslawyer $
* $ Name : shashank gupta $
*************************************************************************
*
* Copyright 2013 @ honeyslawyer and shashank gupta
*
************************************************************************/
#include<cstdio>
#include<iostream>
#include<cmath>
//#include<conio.h>
#include<cstring>
#include<ctype.h>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<string>
#include<climits>
#define mod 1000000007
#define ll long long
using namespace std;
ll gcd(ll a,ll b) {if(b==0) return a; return gcd(b,a%b);}
ll power(ll b,ll exp,ll m)
{ll ans=1;
b%=m;
while(exp)
{if(exp&1)
ans=(ans*b)%m;
exp>>=1;
b=(b*b)%m;
}
return ans;
}
int n;
struct node
{
int sum,mini;
node split(node& l, node& r){}
node merge(node& l, node& r)
{
sum=l.sum+r.sum;
mini=min(l.mini,l.sum+r.mini);
}
};
int MAX=1000020;
struct node tree[1000020];
node createleaf(int val)//the leaf nodes, which represent a single element of the array, will be created in this manner
{
node n;
n.sum=n.mini=val;
return n;
}
//range_query and update function remain same as that for last problem
node range_query(int root, int left_most_leaf, int right_most_leaf, int u, int v)
{
//query the interval [u,v), ie, {x:u<=x<v}
//the interval [left_most_leaf,right_most_leaf) is
//the set of all leaves descending from "root"
if(u<=left_most_leaf && right_most_leaf<=v)
return tree[root];
int mid = (left_most_leaf+right_most_leaf)/2,
left_child = root*2,
right_child = left_child+1;
tree[root].split(tree[left_child], tree[right_child]);
node l=createleaf(+30000+1), r=createleaf(30000+1);
//identity is an element such that merge(x,identity) = merge(identity,x) = x for all x
if(u < mid) l = range_query(left_child, left_most_leaf, mid, u, v);
if(v > mid) r = range_query(right_child, mid, right_most_leaf, u, v);
tree[root].merge(tree[left_child],tree[right_child]);
node n;
n.merge(l,r);
return n;
}
void mergeup(int postn)
{
postn >>=1;
while(postn>0)
{
tree[postn].merge(tree[postn*2],tree[postn*2+1]);
postn >>=1;
}
}
void update(int pos)
{
pos+=(1<<n);
tree[pos].sum*=-1;
tree[pos].mini*=-1;
mergeup(pos);
}
int a[100000];
int m;
int create()
{
scanf("%d",&m);
n=(int)log2(double(2*m-1));
string s;
cin>>s;
//cout<<s;
for(int i=0;i<m;i++)
{
if(s[i]=='(')
a[i]=1;
else
a[i]=-1;
}
for(int i=0;i<MAX;i++)
tree[i].mini=tree[i].sum=INT_MAX;
for(int i=0; i<(1<<n); i++)
{
//printf("%d %d\n",tree[i].mini,tree[i].sum);
tree[i+(1<<n)] = createleaf(a[i]);
}
// update all internal nodes in bottom up fashion
for(int i=(1<<n)-1; i; i--)
tree[i].merge(tree[i*2], tree[i*2+1]);
}
int main()
{
//create();
int t=10;
for(int i=1;i<=10;i++)
{
create();
int k;
scanf("%d",&k);
printf("Test %d:\n",i);
while(k--)
{
int p;
scanf("%d",&p);
if(p>0)
{
//new
update(p-1);
}
else
{
struct node z=range_query(1,1<<n,1<<(n+1),0,300000+100);
if(z.sum==0&&z.mini==0)
printf("YES\n");
else
printf("NO\n");
}
}
}
//getch();
return 0;
/*checklist
1)getch() and conio.h removed.*/
}
LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICQgQXV0aG9yIDogaG9uZXlzbGF3eWVyICAgJAoqICQgTmFtZSAgIDogc2hhc2hhbmsgZ3VwdGEgJAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCioKKiBDb3B5cmlnaHQgMjAxMyBAIGhvbmV5c2xhd3llciBhbmQgc2hhc2hhbmsgZ3VwdGEKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNpbmNsdWRlPGNzdGRpbz4KI2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPGNtYXRoPgovLyNpbmNsdWRlPGNvbmlvLmg+CiNpbmNsdWRlPGNzdHJpbmc+CiNpbmNsdWRlPGN0eXBlLmg+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxzdGRsaWIuaD4KI2luY2x1ZGU8bWFwPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8c3RhY2s+CiNpbmNsdWRlPHNldD4KI2luY2x1ZGU8c3RyaW5nPgojaW5jbHVkZTxjbGltaXRzPgogCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDcKI2RlZmluZSBsbCBsb25nIGxvbmcKIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwpsbCBnY2QobGwgYSxsbCBiKSB7aWYoYj09MCkgcmV0dXJuIGE7IHJldHVybiBnY2QoYixhJWIpO30KIApsbCBwb3dlcihsbCBiLGxsIGV4cCxsbCBtKQoge2xsIGFucz0xOwogIGIlPW07CiAgd2hpbGUoZXhwKQogICB7aWYoZXhwJjEpCiAgICAgYW5zPShhbnMqYiklbTsKICAgIGV4cD4+PTE7CgliPShiKmIpJW07CiAgIH0KICByZXR1cm4gYW5zOwogfQogaW50IG47CiBzdHJ1Y3Qgbm9kZQp7CglpbnQgc3VtLG1pbmk7Cglub2RlIHNwbGl0KG5vZGUmIGwsIG5vZGUmIHIpe30KCW5vZGUgbWVyZ2Uobm9kZSYgbCwgbm9kZSYgcikKCXsKCQlzdW09bC5zdW0rci5zdW07CiAgICAgICAgbWluaT1taW4obC5taW5pLGwuc3VtK3IubWluaSk7Cgl9Cn07CmludCBNQVg9MTAwMDAyMDsKc3RydWN0IG5vZGUgdHJlZVsxMDAwMDIwXTsKbm9kZSBjcmVhdGVsZWFmKGludCB2YWwpLy90aGUgbGVhZiBub2Rlcywgd2hpY2ggcmVwcmVzZW50IGEgc2luZ2xlIGVsZW1lbnQgb2YgdGhlIGFycmF5LCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBtYW5uZXIKewoJbm9kZSBuOwoJbi5zdW09bi5taW5pPXZhbDsKCXJldHVybiBuOwp9Ci8vcmFuZ2VfcXVlcnkgYW5kIHVwZGF0ZSBmdW5jdGlvbiByZW1haW4gc2FtZSBhcyB0aGF0IGZvciBsYXN0IHByb2JsZW0Kbm9kZSByYW5nZV9xdWVyeShpbnQgcm9vdCwgaW50IGxlZnRfbW9zdF9sZWFmLCBpbnQgcmlnaHRfbW9zdF9sZWFmLCBpbnQgdSwgaW50IHYpCnsKCS8vcXVlcnkgdGhlIGludGVydmFsIFt1LHYpLCBpZSwge3g6dTw9eDx2fQoJLy90aGUgaW50ZXJ2YWwgW2xlZnRfbW9zdF9sZWFmLHJpZ2h0X21vc3RfbGVhZikgaXMKCS8vdGhlIHNldCBvZiBhbGwgbGVhdmVzIGRlc2NlbmRpbmcgZnJvbSAicm9vdCIKCWlmKHU8PWxlZnRfbW9zdF9sZWFmICYmIHJpZ2h0X21vc3RfbGVhZjw9dikKCQlyZXR1cm4gdHJlZVtyb290XTsKCWludCBtaWQgPSAobGVmdF9tb3N0X2xlYWYrcmlnaHRfbW9zdF9sZWFmKS8yLAoJCWxlZnRfY2hpbGQgPSByb290KjIsCgkJcmlnaHRfY2hpbGQgPSBsZWZ0X2NoaWxkKzE7Cgl0cmVlW3Jvb3RdLnNwbGl0KHRyZWVbbGVmdF9jaGlsZF0sIHRyZWVbcmlnaHRfY2hpbGRdKTsKCW5vZGUgbD1jcmVhdGVsZWFmKCszMDAwMCsxKSwgcj1jcmVhdGVsZWFmKDMwMDAwKzEpOwoJLy9pZGVudGl0eSBpcyBhbiBlbGVtZW50IHN1Y2ggdGhhdCBtZXJnZSh4LGlkZW50aXR5KSA9IG1lcmdlKGlkZW50aXR5LHgpID0geCBmb3IgYWxsIHgKCWlmKHUgPCBtaWQpIGwgPSByYW5nZV9xdWVyeShsZWZ0X2NoaWxkLCBsZWZ0X21vc3RfbGVhZiwgbWlkLCB1LCB2KTsKCWlmKHYgPiBtaWQpIHIgPSByYW5nZV9xdWVyeShyaWdodF9jaGlsZCwgbWlkLCByaWdodF9tb3N0X2xlYWYsIHUsIHYpOwoJdHJlZVtyb290XS5tZXJnZSh0cmVlW2xlZnRfY2hpbGRdLHRyZWVbcmlnaHRfY2hpbGRdKTsKCW5vZGUgbjsKCW4ubWVyZ2UobCxyKTsKCXJldHVybiBuOwp9CnZvaWQgbWVyZ2V1cChpbnQgcG9zdG4pCnsKCXBvc3RuID4+PTE7Cgl3aGlsZShwb3N0bj4wKQoJewoJCXRyZWVbcG9zdG5dLm1lcmdlKHRyZWVbcG9zdG4qMl0sdHJlZVtwb3N0bioyKzFdKTsKCQlwb3N0biA+Pj0xOwoJfQp9CnZvaWQgdXBkYXRlKGludCBwb3MpCnsKCXBvcys9KDE8PG4pOwoJdHJlZVtwb3NdLnN1bSo9LTE7Cgl0cmVlW3Bvc10ubWluaSo9LTE7CgltZXJnZXVwKHBvcyk7Cn0KaW50IGFbMTAwMDAwXTsKaW50IG07CmludCBjcmVhdGUoKQp7CiAgICBzY2FuZigiJWQiLCZtKTsKICAgIG49KGludClsb2cyKGRvdWJsZSgyKm0tMSkpOwogICAgc3RyaW5nIHM7CiAgICBjaW4+PnM7CiAgICAvL2NvdXQ8PHM7CiAgICBmb3IoaW50IGk9MDtpPG07aSsrKQogICAgewogICAgICAgIGlmKHNbaV09PScoJykKICAgICAgICBhW2ldPTE7CiAgICAgICAgZWxzZQogICAgICAgIGFbaV09LTE7CiAgICB9CmZvcihpbnQgaT0wO2k8TUFYO2krKykKdHJlZVtpXS5taW5pPXRyZWVbaV0uc3VtPUlOVF9NQVg7CiAKZm9yKGludCBpPTA7IGk8KDE8PG4pOyBpKyspCnsKICAgIC8vcHJpbnRmKCIlZCAlZFxuIix0cmVlW2ldLm1pbmksdHJlZVtpXS5zdW0pOwp0cmVlW2krKDE8PG4pXSA9IGNyZWF0ZWxlYWYoYVtpXSk7Cn0KIAovLyB1cGRhdGUgYWxsIGludGVybmFsIG5vZGVzIGluIGJvdHRvbSB1cCBmYXNoaW9uCmZvcihpbnQgaT0oMTw8biktMTsgaTsgaS0tKQp0cmVlW2ldLm1lcmdlKHRyZWVbaSoyXSwgdHJlZVtpKjIrMV0pOwp9CiAKaW50IG1haW4oKQp7CiAgLy9jcmVhdGUoKTsKICBpbnQgdD0xMDsKICBmb3IoaW50IGk9MTtpPD0xMDtpKyspCiAgewogICAgICAgY3JlYXRlKCk7CiAgICAgICBpbnQgazsKICAgICAgIHNjYW5mKCIlZCIsJmspOwogICAgICAgcHJpbnRmKCJUZXN0ICVkOlxuIixpKTsKICAgICAgIHdoaWxlKGstLSkKICAgICAgIHsKICAgICAgICAgICAgaW50IHA7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsJnApOwogICAgICAgICAgICBpZihwPjApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8vbmV3CiAgICAgICAgICAgICAgICB1cGRhdGUocC0xKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RydWN0IG5vZGUgej1yYW5nZV9xdWVyeSgxLDE8PG4sMTw8KG4rMSksMCwzMDAwMDArMTAwKTsKICAgICAgICAgICAgICAgIGlmKHouc3VtPT0wJiZ6Lm1pbmk9PTApCiAgICAgICAgICAgICAgICBwcmludGYoIllFU1xuIik7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludGYoIk5PXG4iKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIAovL2dldGNoKCk7CnJldHVybiAwOwovKmNoZWNrbGlzdAoxKWdldGNoKCkgYW5kIGNvbmlvLmggcmVtb3ZlZC4qLwp9