import std; void main(){ auto input = readln.chomp.split(" "); int N = input[0].to!int; int Q = input[1].to!int; auto S = readln.chomp; int[] a = new int[N + 1]; int[] parent = new int[N + 1]; int node = 0; for(auto i = 1; i <= N; i++){ if(S[i - 1]=='('){ parent[i] = node; node = i; }else{ a[node] = i; a[i] = node; parent[i] = parent[node]; node = parent[node]; } } int[][] dbl; dbl ~= new int[N + 1]; auto depth = new int[N + 1]; for(auto i = 1; i <= N; i++){ depth[i] = depth[parent[i]] + 1; dbl[0][i] = parent[i]; } auto max_depth = depth.maxElement; for(auto k = 1; k < max_depth; k *= 2){ dbl ~= new int[N + 1]; for(auto i = 1; i <= N; i++){ dbl[$ - 1][i] = dbl[$ - 2][dbl[$ - 2][i]]; } } for(auto q = 0; q < Q; q++){ input = readln.chomp.split(" "); int x = input[0].to!int; int y = input[1].to!int; if(depth[x] < depth[y]){ auto t = x; x = y; y = t; } auto d = depth[x] - depth[y]; auto k = 0; while(d > 0){ if(d & 1){ x = dbl[k][x]; } k++; d >>= 1; } //stderr.writeln([x,y]); if(x == a[y] || x == y){ writefln("%d %d", min(x, a[x]), max(x, a[x])); continue; } for(k = cast(int)dbl.length - 1; k >= 0; k--){ if(dbl[k][x] != dbl[k][y]){ x = dbl[k][x]; y = dbl[k][y]; } } //stderr.writeln(">",[x,y]); if(parent[x] > 0){ writefln("%d %d", parent[x], a[parent[x]]); }else{ writeln(-1); } } }