#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <climits>
#include <algorithm>
#include <cmath>
using namespace std;
#define SIZE 200005
#define DIRS 6
int countarr[SIZE][DIRS]; //Save count of movement during ith index in jth direction
int previous[SIZE]; //No of degrees turned before ith index
int main() {
int t, n, q, s, e, ie, is;
char c;
double x, y;
double PI = 2*acos(0);
double cos60 = cos((60.0 * PI)/180.0);
double sin60 = sin((60.0 * PI)/180.0);
//Distance moved in xdirection for i*60 degrees
double diffx[] = {1.0, cos60, -cos60, -1.0, -cos60, cos60};
//Distance moved in ydirection for i*60 degrees
double diffy[] = {0.0, sin60, sin60, 0.0, -sin60, -sin60};
cin >> t;
while(t--) {
cin >> n >> q;
for (int j = 0; j < DIRS; j++) {
countarr[0][j] = 0;
}
previous[0] = 0;
for (int i = 1; i <= n; i++) { //Save in 1-nth index, to avoid edge cases
cin>>c;
for (int j = 0; j < DIRS; j++) { //Calculate no of moves in each direction till jth entry
countarr[i][j] = countarr[i-1][j];
if ((previous[i-1] + (c - '0'))%DIRS == j) {
previous[i] = j;
countarr[i][j]++;
}
}
}
for (int i = 0; i < q; i++) { //For each query
cin >> s >> e;
s--;
x = 0;
y = 0;
for (int j = 0; j < DIRS; j++) { //In each direction
//Re-map jth direction and add offsets
x += diffx[(j + DIRS - previous[s])%DIRS]*(countarr[e][j] - countarr[s][j]);
y += diffy[(j + DIRS - previous[s])%DIRS]*(countarr[e][j] - countarr[s][j]);
}
printf("%.8f %.8f\n", x, y);
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxzdGFjaz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjbWF0aD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBTSVpFIDIwMDAwNQojZGVmaW5lIERJUlMgNgppbnQgY291bnRhcnJbU0laRV1bRElSU107IC8vU2F2ZSBjb3VudCBvZiBtb3ZlbWVudCBkdXJpbmcgaXRoIGluZGV4IGluIGp0aCBkaXJlY3Rpb24KaW50IHByZXZpb3VzW1NJWkVdOyAvL05vIG9mIGRlZ3JlZXMgdHVybmVkIGJlZm9yZSBpdGggaW5kZXgKCmludCBtYWluKCkgewogIGludCB0LCBuLCBxLCBzLCBlLCBpZSwgaXM7CiAgY2hhciBjOwogIGRvdWJsZSB4LCB5OwogIGRvdWJsZSBQSSA9IDIqYWNvcygwKTsKICBkb3VibGUgY29zNjAgPSBjb3MoKDYwLjAgKiBQSSkvMTgwLjApOwogIGRvdWJsZSBzaW42MCA9IHNpbigoNjAuMCAqIFBJKS8xODAuMCk7CgogIC8vRGlzdGFuY2UgbW92ZWQgaW4geGRpcmVjdGlvbiBmb3IgaSo2MCBkZWdyZWVzCiAgZG91YmxlIGRpZmZ4W10gPSB7MS4wLCBjb3M2MCwgLWNvczYwLCAtMS4wLCAtY29zNjAsIGNvczYwfTsgCiAgLy9EaXN0YW5jZSBtb3ZlZCBpbiB5ZGlyZWN0aW9uIGZvciBpKjYwIGRlZ3JlZXMKICBkb3VibGUgZGlmZnlbXSA9IHswLjAsIHNpbjYwLCBzaW42MCwgMC4wLCAtc2luNjAsIC1zaW42MH07CgogIGNpbiA+PiB0OwogIHdoaWxlKHQtLSkgewogICAgY2luID4+IG4gPj4gcTsKICAgIGZvciAoaW50IGogPSAwOyBqIDwgRElSUzsgaisrKSB7CiAgICAgIGNvdW50YXJyWzBdW2pdID0gMDsKICAgIH0KICAgIHByZXZpb3VzWzBdID0gMDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgeyAvL1NhdmUgaW4gMS1udGggaW5kZXgsIHRvIGF2b2lkIGVkZ2UgY2FzZXMKICAgICAgY2luPj5jOwogICAgICBmb3IgKGludCBqID0gMDsgaiA8IERJUlM7IGorKykgeyAvL0NhbGN1bGF0ZSBubyBvZiBtb3ZlcyBpbiBlYWNoIGRpcmVjdGlvbiB0aWxsIGp0aCBlbnRyeQogICAgICAgIGNvdW50YXJyW2ldW2pdID0gY291bnRhcnJbaS0xXVtqXTsgCiAgICAgICAgaWYgKChwcmV2aW91c1tpLTFdICsgKGMgLSAnMCcpKSVESVJTID09IGopIHsKICAgICAgICAgIHByZXZpb3VzW2ldID0gajsKICAgICAgICAgIGNvdW50YXJyW2ldW2pdKys7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxOyBpKyspIHsgLy9Gb3IgZWFjaCBxdWVyeQogICAgICBjaW4gPj4gcyA+PiBlOwogICAgICBzLS07CiAgICAgIHggPSAwOwogICAgICB5ID0gMDsKICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBESVJTOyBqKyspIHsgLy9JbiBlYWNoIGRpcmVjdGlvbgogICAgCS8vUmUtbWFwIGp0aCBkaXJlY3Rpb24gYW5kIGFkZCBvZmZzZXRzCiAgICAgICAgeCArPSBkaWZmeFsoaiArIERJUlMgLSBwcmV2aW91c1tzXSklRElSU10qKGNvdW50YXJyW2VdW2pdIC0gY291bnRhcnJbc11bal0pOyAKICAgICAgICB5ICs9IGRpZmZ5WyhqICsgRElSUyAtIHByZXZpb3VzW3NdKSVESVJTXSooY291bnRhcnJbZV1bal0gLSBjb3VudGFycltzXVtqXSk7CiAgICAgIH0KICAgICAgcHJpbnRmKCIlLjhmICUuOGZcbiIsIHgsIHkpOwogICAgfQogIH0KICByZXR1cm4gMDsKfQo=