Go: package main

import (
	"bufio"
	"os"
	"strconv"
	"strings"
	"fmt"
)

var scanner = bufio.NewScanner(os.Stdin)

func main() {
	x := make([]int, 100)
	y := make([]int, 100)
	r := make([]int, 100)
	for scanner.Scan() {
		a, _ := strconv.Atoi(scanner.Text())
		if a == 0 {
			break
		}
		for i := 0; i < a; i++ {
			scanner.Scan()
			input := strings.Split(scanner.Text(), " ")
			tmpx, _ := strconv.Atoi(input[0])
			tmpy, _ := strconv.Atoi(input[1])
			tmpr, _ := strconv.Atoi(input[2])
			x[i], y[i], r[i] = tmpx, tmpy, tmpr
		}
		scanner.Scan()
		b, _ := strconv.Atoi(scanner.Text())
		for i := 0; i < b; i++ {
			scanner.Scan()
			input := strings.Split(scanner.Text(), " ")
			c, _ := strconv.Atoi(input[0])
			d, _ := strconv.Atoi(input[1])
			e, _ := strconv.Atoi(input[2])
			f, _ := strconv.Atoi(input[3])
			ok := false
			for j := 0; j < a; j++ {
				if (c-x[j])*(c-x[j])+(d-y[j])*(d-y[j]) >= r[j]*r[j] || (e-x[j])*(e-x[j])+(f-y[j])*(f-y[j]) >= r[j]*r[j] {
					if (e-c)*(x[j]-c)+(f-d)*(y[j]-d) < 0 {
						if (x[j]-c)*(x[j]-c)+(y[j]-d)*(y[j]-d) <= r[j]*r[j] {
							ok = true
						}
					} else {
						if (e-c)*(x[j]-c)+(f-d)*(y[j]-d)>(e-c)*(e-c)+(f-d)*(f-d) {
							if (x[j]-e)*(x[j]-e)+(y[j]-f)*(y[j]-f)<=r[j]*r[j] {
								ok = true
							}
						} else {
							if (x[j]-c)*(x[j]-c)+(y[j]-d)*(y[j]-d)-((e-c)*(x[j]-c)+(f-d)*(y[j]-d))*((e-c)*(x[j]-c)+(f-d)*(y[j]-d))/((e-c)*(e-c)+(f-d)*(f-d))<=r[j]*r[j] {
								ok = true
							}
						}
					}

				}
			}
			if ok {
				fmt.Println("Safe")
			} else {
				fmt.Println("Danger")
			}
		}
	}
}

C++: #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <unordered_map>
#include <unordered_set>

#include <functional>
#include <cassert>

typedef long long ll;
using namespace std;

#define debug(x) cerr << #x << " = " << (x) << endl;


#define mod 1000000007 //1e9+7(prime number)
#define INF 1000000000 //1e9
#define LLINF 2000000000000000000LL //2e18
#define SIZE 1010

/* Point (x,y)*/
struct P{
  typedef double Type;
  
  Type x,y;
  
  P(Type X,Type Y){
    x = X;
    y = Y;
  }
  
  P rotate(double theta){
    return P(y*cos(theta)-x*sin(theta),y*sin(theta)+x*cos(theta));
  }
  
  bool operator< (const P &B) const{
    return x==B.x ? y < B.y : x < B.x;
  }
  
};

/* Line ax+bx+c=0 */
struct Line{
  typedef double Type;
  
  Type a,b,c;
  
  Line(Type A,Type B,Type C){
    a = A;
    b = B;
    c = C;
  }
  
  //2???(x_1,y_1),(x_2,y_2)???????????´???
  Line(Type x_1,Type y_1,Type x_2,Type y_2){
    a = y_1-y_2;
    b = x_2-x_1;
    c = y_1*(x_1-x_2)-x_1*(y_1-y_2);
  }
  
  /*??\??????Type???????????????double*/
  
  // y??§?¨???????x??§?¨??????????
  double x(double y){
    return -(double)(b*y+c)/a;
  }
  
  // x??§?¨???????y??§?¨??????????
  double y(double x){
    return -(double)(a*x+c)/b;
  }
  
};


int solve(){
  int n,m;
  int wx[SIZE], wy[SIZE], r[SIZE];
  const double eps = 1e-10;
  
  scanf("%d",&n);

  if(n == 0) return false;
  
  for(int i=0;i<n;i++){
    scanf("%d%d%d",wx+i, wy+i,r+i);
  }

  scanf("%d",&m);
  
  for(int i=0;i<m;i++){
    int tx,ty,sx,sy;
    bool flag = false;
    
    scanf("%d%d%d%d",&tx,&ty,&sx,&sy);

    Line l(tx,ty,sx,sy);

    for(int j=0;j<n;j++){

      double dist = abs(l.a * wx[j] + l.b * wy[j] + l.c)/sqrt(l.a*l.a + l.b*l.b);
      int dist1 = (wx[j]-tx)*(wx[j]-tx) + (wy[j]-ty)*(wy[j]-ty);
      int dist2 = (wx[j]-sx)*(wx[j]-sx) + (wy[j]-sy)*(wy[j]-sy);

      if(dist1 <= r[j]*r[j] && dist2 <= r[j]*r[j]) continue;
      if(dist > r[j] + eps) continue;
      
      //y = ax+b
      double a = -1/l.a;
      double b = wy[j] - a*wx[j];

      double cx = (- l.c - b * l.b)/(l.a + a * l.b);
      
      if(min(tx,sx) <= cx+eps && cx-eps <= max(tx,sx)){
        flag = true;
      }else{
        if(dist1 <= r[j]*r[j] || dist2 <= r[j]*r[j]){
          flag = true;
        }
      }
      
    }

    if(flag)
      puts("Safe");
    else
      puts("Danger");
  }


  
  return true;
}

int main(){

  while(solve());

}

C++: #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <complex>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000
#define sz(x) ((int)(x).size())
#define fi first
#define sec second
#define SORT(x) sort((x).begin(),(x).end())
#define all(x) (x).begin(),(x).end()
#define EQ(a,b) (abs((a)-(b))<EPS)
int n,m;
vector<P> vec;
vector<int> rad;
P s,t;
bool in(int x,P a)
{
	return hypot(a.fi-vec[x].fi,a.sec-vec[x].sec)<(double)rad[x];
}
ll sq(ll x)
{
	return x*x;
}
bool check()
{
	for(int i=0;i<n;i++)
	{
		bool in1,in2;
		in1=in(i,s);in2=in(i,t);
		if(in1!=in2)return false;
		if(in1&&in2)continue;
		ll a=s.fi,b=s.sec,c=t.fi,d=t.sec,p=vec[i].fi,q=vec[i].sec;
		if(a>c)
		{
			swap(a,c);swap(c,d);
		}
		ll A=sq(d-b)+sq(c-a);
		ll B=(b*c-a*d)*(d-b)-p*sq(c-a)-(c-a)*(d-b)*q;
		ll C=p*p*sq(c-a)+sq(b*c-a*d-q*c+q*a)-sq(rad[i])*sq(c-a);
		//cout << A << ' ' << B << ' ' << C  << ' ' << B*B-A*C<< endl;
		if(B*B-A*C<0)continue;
		else if(B*B-A*C==0)
		{
			if(a<=(-B/A)&&(-B/A)<=c)return false;
			else continue;
		}
		else
		{
			double ans1=(-B+sqrt(B*B-A*C))/A;
			double ans2=(-B-sqrt(B*B-A*C))/A;
			if(ans1>=a&&ans2<=c)return false;
			else continue;
		}
	}
	return true;
}
int main()
{
	while(1)
	{
		vec.clear();
		rad.clear();
		scanf("%d",&n);
		if(n==0)break;
		for(int i=0;i<n;i++)
		{
			P k;
			int r;
			scanf("%d %d %d",&k.fi,&k.sec,&r);
			vec.pb(k);
			rad.pb(r);
		}
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d %d %d %d",&t.fi,&t.sec,&s.fi,&s.sec);
			if(check())puts("Danger");
			else puts("Safe");
		}
	}
	return 0;
}