#include #include #include using namespace atcoder; using mint = modint998244353; using namespace std; #define rep(i,n) for(int i=0;i<(n);i++) #define Inf 1000000001 string S; vector> ps(1,vector(2,-1)); vector> E(1); void dfs(int cur,int &pos){ while(pos!=S.size()){ if(S[pos]=='('){ int to = E.size(); E[cur].push_back(to); E.push_back(vector(1,cur)); ps.push_back(vector(1,pos)); pos++; dfs(to,pos); } else{ ps[cur].push_back(pos); pos++; return; } } } struct lca{ vector depth; vector> parents; int max_j=18; lca(int n,vector> &E){ rep(i,100){ if((1<E.size()){ max_j = i; break; } } depth.assign(E.size(),-1); parents.assign(E.size(),vector(max_j,-1)); stack s; s.push(n); depth[n] = 0; while(s.size()!=0){ int k = s.top(); s.pop(); for(int i=0;i=0;i--){ if(parents[u][i]!=parents[v][i]){ u = parents[u][i]; v = parents[v][i]; } } return parents[u][0]; } int get_distance(int u,int v){ return depth[u]+depth[v]-2*depth[query(u,v)]; } }; int main(){ int N,Q; cin>>N>>Q; cin>>S; int p = 0; dfs(0,p); /* rep(i,ps.size()){ cout< pos(S.size()); rep(i,ps.size()){ if(ps[i][0]==-1)continue; rep(j,2)pos[ps[i][j]] = i; } rep(_,Q){ int a,b; scanf("%d %d",&a,&b); a--;b--; int l = L.query(pos[a],pos[b]); if(ps[l][0]==-1){ printf("-1\n"); } else{ int x = ps[l][0],y = ps[l][1]; if(x>y)swap(x,y); x++,y++; printf("%d %d\n",x,y); } } return 0; }