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 <iostream>
#include <vector>
#include <map>
#include <stack>
#include <list>
#include <queue>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <math.h>

#define NITENKAN(a, b) sqrt(((a.first - b.first) * (a.first - b.first)) + ((a.second - b.second) * (a.second - b.second)))

using namespace std;

bool checkFound(pair<double, double> taro, pair<double, double> oni, pair<pair<double, double>, double> syougai){
	double ac = NITENKAN(syougai.first, oni);
	double ab = NITENKAN(taro, oni);
	double bc = NITENKAN(syougai.first, taro);

	if(ac >= ab || bc >= ab){
		return true;
	}

	double naiseki =  (taro.first - oni.first) * (syougai.first.first - oni.first) + (taro.second - oni.second) * (syougai.first.second - oni.second);
	double cosSita = naiseki / (ab * ac);
	double t = ac * (1 - cosSita);//(sita * 3.14 / 180.0));
	t *= syougai.second;
	/*
	cout << "ac : " << ac << endl;
	cout << "ab : " << ab << endl;
	cout << "naiseki : " << naiseki << endl;
	cout << "cosSita : " << cosSita << endl;
	cout << "t : " << t << endl;
	*/

	if(t > syougai.second){
		return true;
	}
	else{
		return false;
	}
}

int main(){
	int n = 0;

	while(cin >> n && n != 0){
		int m = 0;
		bool danger = false;
		vector<pair<pair<double, double>, double>> syougai(n);

		for(int i = 0; i < n; i++){
			cin >> syougai[i].first.first >> syougai[i].first.second >> syougai[i].second;
		}
		
		cin >> m;
		vector<pair<double, double>> taro(m);
		vector<pair<double, double>> oni(m);
		for(int j = 0; j < m; j++){
			//cinと比較、結果出力を書く
			cin >> taro[j].first >> taro[j].second >> oni[j].first >> oni[j].second;

			//太郎と鬼の現在位置における各障害物の影響を見る
			for(int l = 0; l < n; l++){
				//二人共円内
				if((NITENKAN(taro[j], syougai[l].first) < syougai[l].second) && (NITENKAN(oni[j], syougai[l].first) < syougai[l].second)){
					//円内に円がある可能性があるので他の障害物の影響を見る
					for(int a = l + 1; a < n; a++){
						danger = checkFound(taro[j], oni[j], syougai[a]);
						if(!danger){
							break;
						}
					}
				}
				//二人共円外
				else if((NITENKAN(taro[j], syougai[l].first) > syougai[l].second) &&  (NITENKAN(oni[j], syougai[l].first) > syougai[l].second)){
					danger = checkFound(taro[j], oni[j], syougai[l]);
				}
				else{
					danger = false;
				}
				if(!danger){
					break;		
				}
			}

			if(!danger){
				cout << "SAFE" << endl;
			}
			else{
				cout << "DANGER" << endl;
			}

		}
	}
}

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-8;
  
  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;

      if(dist1 <= r[j]*r[j] || dist2 <= r[j]*r[j]){
        flag = true;
      }
      
      //y = ax+b
      double a = -1/l.a;
      double b = wy[j] - a*wx[j];
      /*
      aqx = qy - qb
      px = -qy - r

      (aq + p)x = - (qb + r)
      */
      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;
      }
      
    }

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

int main(){

  while(solve());

}