QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#532585#9227. Henry the Plumberucup-team1134#WA 1ms3800kbC++2315.3kb2024-08-25 05:54:242024-08-25 05:54:24

Judging History

你现在查看的是最新测评结果

  • [2024-08-25 05:54:24]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3800kb
  • [2024-08-25 05:54:24]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=998244353,MAX=300005,INF=15<<26;

#define double long double

//幾何ライブラリ
// define double ll をするときは Point の < と == も書き換えよう!

const double eps=1e-8;
const double pi=acos((double)-1.0L);
#define equals(a,b) (fabs((a)-(b))<eps)

double torad(double deg) {return (double)(deg)*pi/180.0;}
double todeg(double ang) {return ang*180.0/pi;}

class Point{
public:
    double x,y;
    
    Point(double x=0,double y=0):x(x),y(y){}
    
    Point operator + (Point p){return Point(x+p.x,y+p.y);}
    Point operator - (Point p){return Point(x-p.x,y-p.y);}
    Point operator * (double a){return Point(a*x,a*y);}
    Point operator / (double a){return Point(x/a,y/a);}
    
    double abs(){return sqrt(norm());}
    double norm(){return x*x+y*y;}
    
    bool operator < (const Point &p)const{
        return x+eps<p.x||(equals(x,p.x)&&y+eps<p.y);
//return x<p.x||(x==p.x&&y<p.y);
    }
    
    bool operator == (const Point &p)const{
        return fabs(x-p.x)<eps/100000&&fabs(y-p.y)<eps/100000;
//return x==p.x&&y==p.y;
    }
};

typedef Point Vector;

double norm(Vector a){
    return a.x*a.x+a.y*a.y;
}

double abs(Vector a){
    return sqrt(norm(a));
}

double dot(Vector a,Vector b){
    return a.x*b.x+a.y*b.y;
}

double cross(Vector a,Vector b){
    return a.x*b.y-a.y*b.x;
}

struct Segment{
    Point p1,p2;
};

bool isOrthogonal(Vector a,Vector b){
    return equals(dot(a,b),0.0);
}

bool isOrthogonal(Point a1,Point a2,Point b1,Point b2){
    return isOrthogonal(a1-a2,b1-b2);
}

bool isOrthogonal(Segment s1,Segment s2){
    return equals(dot(s1.p2-s1.p1,s2.p2-s2.p1),0.0);
}

bool isParallel(Vector a,Vector b){
    return equals(cross(a,b),0.0);
}

bool isParallel(Point a1,Point a2,Point b1,Point b2){
    return isParallel(a1-a2,b1-b2);
}

bool isParallel(Segment s1,Segment s2){
    return equals(cross(s1.p2-s1.p1,s2.p2-s2.p1),0.0);
}

Point project(Segment s,Point p){
    Vector base=s.p2-s.p1;
    double r=dot(p-s.p1,base)/norm(base);
    return s.p1+base*r;
}

Point reflect(Segment s,Point p){
    return p+(project(s,p)-p)*2.0;
}

Point turn(Point p,Point c,double pi){
    double q=atan2(p.y-c.y,p.x-c.x);
    q+=pi;
    p=c+Point{cos(q)*abs(p-c),sin(q)*abs(p-c)};
    
    return p;
}
//pをcを中心としてpi回転させる(1周で2π)
//p=cのときnan

//p0,p1,p2の順に見たときどうなるか?

static const int counter_clockwise=1;
static const int clockwise=-1;
static const int online_back=2;
static const int online_front=-2;
static const int on_segment=0;

int ccw(Point p0,Point p1,Point p2){
    Vector a=p1-p0;
    Vector b=p2-p0;
    
    if(cross(a,b)>eps) return counter_clockwise;
    if(cross(a,b)<-eps) return clockwise;
    if(dot(a,b)<-eps) return online_back;
    if(a.norm()<b.norm()) return online_front;
    
    return on_segment;
}

bool intersect(Point p1,Point p2,Point p3,Point p4){
    return(ccw(p1,p2,p3)*ccw(p1,p2,p4)<=0&&ccw(p3,p4,p1)*ccw(p3,p4,p2)<=0);
}

bool intersect(Segment s1,Segment s2){
    return intersect(s1.p1,s1.p2,s2.p1,s2.p2);
}

bool overlap(Segment s1,Segment s2){
    int a=ccw(s1.p1,s1.p2,s2.p1),b=ccw(s1.p1,s1.p2,s2.p2);
    if(a&1||b&1) return 0;
    if(a==2){
        if(b==-2||(b==0&&!(s2.p2==s1.p1))) return 1;
        else return 0;
    }
    if(a==-2){
        if(b==2||(b==0&&!(s2.p2==s1.p2))) return 1;
        else return 0;
    }
    if(a==0){
        if(s1.p1==s2.p1){
            if(b!=2) return 1;
            else return 0;
        }
        else if(s1.p2==s2.p1){
            if(b!=-2) return 1;
            else return 0;
        }
        else return 1;
    }
    return 0;
}
//s1とs2の共通の線分(長さ0より大きい)があるかどうか

typedef Segment Line;

double getDistance(Point a,Point b){
    return abs(a-b);
}

double getDistanceLP(Line l,Point p){
    return abs(cross(l.p2-l.p1,p-l.p1)/abs(l.p2-l.p1));
}

double getDistanceSP(Segment s,Point p){
    if(dot(s.p2-s.p1,p-s.p1)<0.0) return abs(p-s.p1);
    if(dot(s.p1-s.p2,p-s.p2)<0.0) return abs(p-s.p2);
    return getDistanceLP(s,p);
}

double getDistance(Segment s1,Segment s2){
    if(intersect(s1,s2)) return 0.0;
    return min({getDistanceSP(s1,s2.p1),getDistanceSP(s1,s2.p2),getDistanceSP(s2,s1.p1),getDistanceSP(s2,s1.p2)});
}

Point getCrossPointS(Segment s1,Segment s2){
    //if(ccw(s1.p1,s1.p2,s2.p1)==0&&ccw(s1.p1,s1.p2,s2.p2)==0) return s1.p1;
    Vector base=s2.p2-s2.p1;
    double d1=abs(cross(base,s1.p1-s2.p1));
    double d2=abs(cross(base,s1.p2-s2.p1));
    double t=d1/(d1+d2);
    return s1.p1+(s1.p2-s1.p1)*t;
}//同じ時壊れます

Point getCrossPointL(Line l1,Line l2){
    //if(ccw(s1.p1,s1.p2,s2.p1)==0&&ccw(s1.p1,s1.p2,s2.p2)==0) return s1.p1;
    
    Vector v1=l1.p2-l1.p1,v2=l2.p2-l2.p1;
    
    return l1.p1+v1*cross(v2,l2.p1-l1.p1)/cross(v2,v1);
}

Segment ParallelSegment(Segment s,double d){
    Vector v={-(s.p2-s.p1).y,(s.p2-s.p1).x};
    v=v/abs(v);
    
    s.p1=s.p1+v*d;
    s.p2=s.p2+v*d;
    
    return s;
}

Point naisin(Point p1,Point p2,Point p3){
    if(p1==p2&&p2==p3&&p3==p1) return p1;
    
    return (p1*abs(p2-p3)+p2*abs(p1-p3)+p3*abs(p1-p2))/(abs(p2-p3)+abs(p1-p3)+abs(p1-p2));
}

Point naisin(Line l1,Line l2,Line l3){
    //平行でない前提
    
    Point p1=getCrossPointL(l1,l2),p2=getCrossPointL(l1,l3),p3=getCrossPointL(l2,l3);
    return naisin(p1,p2,p3);
}

//ネットの適当を書いたのであってるか全く知りません→あってそう

class Circle{
public:
    Point c;
    double r;
    Circle(Point c=Point(),double r=0.0):c(c),r(r){}
};

Point CircleCenter(Point a,Point b,Point c){
    Point u=a-b,v=a-c;
    double m1=(norm(a)-norm(b))/2.0,m2=(norm(a)-norm(c))/2.0;
    
    Point res;
    if(cross(u,v)==0.0){
        res.x=1e9;
        res.y=1e9;
        
        return res;
    }
    res.x=(m1*v.y-m2*u.y)/cross(u,v);
    res.y=(m1*v.x-m2*u.x)/cross(v,u);
    
    return res;
}
//3点を通る円の中心を返す

//交わる 0
// c1がc2のinside 1
// c1がc2のoutside 2
// 交わらない 3

int not_intersect(Circle c1,Circle c2){
    double d=getDistance(c1.c,c2.c);
    double r1=c1.r,r2=c2.r;
    if(r1<r2){
        if(d<(r2-r1)) return 1;
    }
    if(r1>r2){
        if(d<(r1-r2)) return 2;
    }
    if(d<=r1+r2) return 0;
    else return 3;
}

pair<Point,Point> segCrossPpoints(Circle c,Line l){
    //assert(intersect(c,l));
    Vector pr=project(l,c.c);
    Vector e=(l.p2-l.p1)/abs(l.p2-l.p1);
    double base=sqrt(c.r*c.r-norm(pr-c.c));
    return make_pair(pr+e*base,pr-e*base);
}

double arg(Vector p){return atan2(p.y,p.x);}
Vector polar(double a,double r){return Point(cos(r)*a,sin(r)*a);}

//inside(outside)

pair<Point,Point> getCrossPoints(Circle c1,Circle c2){
    //assert(intersect(c1,c2));
    double d=abs(c1.c-c2.c);
    double a=acos((c1.r*c1.r+d*d-c2.r*c2.r)/(2*c1.r*d));
    double t=arg(c2.c-c1.c);
    return make_pair(c1.c+polar(c1.r,t+a),c1.c+polar(c1.r,t-a));
}

vector<Line> Commontangent(Circle c1,Circle c2){
    vector<Line> res;
    Point p=c2.c-c1.c;
    
    if(abs(p)>=(c1.r+c2.r)){
        Point a,b;
        a.x=c1.r*(p.x*(c1.r+c2.r)+p.y*sqrt(norm(p)-(c1.r+c2.r)*(c1.r+c2.r)))/norm(p);
        a.y=c1.r*(p.y*(c1.r+c2.r)-p.x*sqrt(norm(p)-(c1.r+c2.r)*(c1.r+c2.r)))/norm(p);
        
        b.x=c1.r*(p.x*(c1.r+c2.r)-p.y*sqrt(norm(p)-(c1.r+c2.r)*(c1.r+c2.r)))/norm(p);
        b.y=c1.r*(p.y*(c1.r+c2.r)+p.x*sqrt(norm(p)-(c1.r+c2.r)*(c1.r+c2.r)))/norm(p);
        
        res.push_back(Line{a+c1.c,a+c1.c+Point{-a.y,a.x}});
        if(!(a==b)){
            res.push_back(Line{b+c1.c,b+c1.c+Point{-b.y,b.x}});
        }
    }
    
    if(abs(p)>=abs(c1.r-c2.r)){
        Point a,b;
        a.x=c1.r*(p.x*(c1.r-c2.r)+p.y*sqrt(norm(p)-(c1.r-c2.r)*(c1.r-c2.r)))/norm(p);
        a.y=c1.r*(p.y*(c1.r-c2.r)-p.x*sqrt(norm(p)-(c1.r-c2.r)*(c1.r-c2.r)))/norm(p);
        
        b.x=c1.r*(p.x*(c1.r-c2.r)-p.y*sqrt(norm(p)-(c1.r-c2.r)*(c1.r-c2.r)))/norm(p);
        b.y=c1.r*(p.y*(c1.r-c2.r)+p.x*sqrt(norm(p)-(c1.r-c2.r)*(c1.r-c2.r)))/norm(p);
        
        res.push_back(Line{a+c1.c,a+c1.c+Point{-a.y,a.x}});
        if(!(a==b)){
            res.push_back(Line{b+c1.c,b+c1.c+Point{-b.y,b.x}});
        }
    }
    
    return res;
}

typedef vector<Point> Polygon;

/*
 IN 2
 ON 1
 OUT 0
 */

int contains(Polygon g,Point p){
    int n=int(g.size());
    bool x=false;
    for(int i=0;i<n;i++){
        Point a=g[i]-p,b=g[(i+1)%n]-p;
        if(a.y>b.y) swap(a,b);
        if(a.y<eps&&0<b.y&&cross(a,b)<0) x=!x;
        if(abs(cross(a,b))<eps&&dot(a,b)<eps) return 1;
    }
    return (x?2:0);
}

Polygon andrewScan(Polygon s,bool ok){
    Polygon u,l;
    sort(all(s));
    
    if(int(s.size())<3) return s;
    int n=int(s.size());
    
    u.push_back(s[0]);
    u.push_back(s[1]);
    
    l.push_back(s[n-1]);
    l.push_back(s[n-2]);
    
    if(ok){
        for(int i=2;i<n;i++){
            for(int j=int(u.size());j>=2&&ccw(u[j-2],u[j-1],s[i])==counter_clockwise;j--){
                u.pop_back();
            }
            u.push_back(s[i]);
        }
        
        for(int i=int(s.size())-3;i>=0;i--){
            for(int j=int(l.size());j>=2&&ccw(l[j-2],l[j-1],s[i])==counter_clockwise;j--){
                l.pop_back();
            }
            l.push_back(s[i]);
        }
    }
    
    if(!ok){
        for(int i=2;i<n;i++){
            for(int j=int(u.size());j>=2&&ccw(u[j-2],u[j-1],s[i])!=clockwise;j--){
                u.pop_back();
            }
            u.push_back(s[i]);
        }
        
        for(int i=int(s.size())-3;i>=0;i--){
            for(int j=int(l.size());j>=2&&ccw(l[j-2],l[j-1],s[i])!=clockwise;j--){
                l.pop_back();
            }
            l.push_back(s[i]);
        }
    }
    
    reverse(all(l));
    
    for(int i=int(u.size())-2;i>=1;i--) l.push_back(u[i]);
    
    return l;
}//ok==1なら辺の上も含める

Polygon convex_cut(const Polygon& P, const Line& l) {
    Polygon Q;
    for(int i=0;i<si(P);i++){
        Point A=P[i],B=P[(i+1)%si(P)];
        if(ccw(l.p1,l.p2,A)!=-1)Q.push_back(A);
        if(ccw(l.p1,l.p2,A)*ccw(l.p1,l.p2,B)<0) Q.push_back(getCrossPointL(Line{A,B},l));
    }
    return Q;
}

double area(Point a,Point b,Point c){
    b=b-a;
    c=c-a;
    return abs(b.x*c.y-b.y*c.x)/2.0;
}

/*

ll area(Polygon P){
    ll sum=0;
    for(int i=0;i<si(P);i++){
        sum+=cross(P[i],P[(i+1)%si(P)]);
    }
    return abs(sum);
}

*/

// 倍

double area(Polygon &P){
    if(si(P)==0) return 0.0;
    double res=0;
    Point c={0.0,0.0};
    for(int i=0;i<si(P);i++){
        c=c+P[i];
    }
    c=c/si(P);
    
    for(int i=0;i<si(P);i++){
        res+=area(c,P[i],P[(i+1)%si(P)]);
    }
    
    return res;
}

ll gcd(ll a,ll b){
    if(b==0) return a;
    return gcd(b,a%b);
}

pair<Point,Vector> perpendicular_bisector(Point a,Point b){
    Point c=(a+b)/2;
    Vector v=b-c;
    swap(v.x,v.y);
    v.x*=-1;
    
    Point p=c;
    if(v.x==0){
        v.y=1;
        p.y=0;
    }
    else if(v.y==0){
        v.x=1;
        p.x=0;
    }
    else{
        if(v.x<0){
            v.x*=-1;
            v.y*=-1;
        }
        ll g=gcd(abs(ll(v.x)),abs(ll(v.y)));
        v.x/=g;
        v.y/=g;
        if(p.x>=0){
            ll d=p.x/v.x;
            p=p-v*d;
        }else{
            ll d=abs(p.x)/v.x;
            p=p+v*d;
            
            if(p.x<0){
                p=p+v;
            }
        }
    }
    
    return mp(p,v);
}
//2倍するなりして整数にしておくこと

/*
Line perpendicular_bisector(Point a,Point b){
    Point c=(a+b)/2;
    Point d=turn(a,c,M_PI/2.0);
    
    return {c,d};
}
//2倍するなりして整数にしておくこと
*/
pair<Line,Line> angle_bisector(Line a,Line b){
    // assert(!isParallel(a,b));
    
    Point p=getCrossPointL(a,b);
    
    if(a.p1==p) swap(a.p1,a.p2);
    if(b.p1==p) swap(b.p1,b.p2);
    
    double kaku1=arg(a.p1-p);
    double kaku2=arg(b.p1-p);
    
    return mp(Line{p,p+polar(1.0,(kaku1+kaku2)/2.0)},Line{p,p+polar(1.0,(kaku1+kaku2+M_PI)/2.0)});
    
}


Line abc_to_line(double a,double b,double c){
    if(a==0){
        if(b==0){
            if(c>=0){
                return {{-INF,-INF},{INF,-INF}};
            }else{
                return {{-INF,INF},{INF,INF}};
            }
        }else if(b>0){
            return {{0,-c/b},{1,-c/b}};
        }else{
            return {{1,-c/b},{0,-c/b}};
        }
    }else if(a>0){
        if(b==0){
            return {{-c/a,1},{-c/a,0}};
        }else{
            if(b>0){
                return {{0,-c/b},{1,-(a+c)/b}};
            }else{
                return {{1,-(a+c)/b},{0,-c/b}};
            }
        }
    }else{
        if(b==0){
            return {{-c/a,0},{-c/a,1}};
        }else{
            if(b>0){
                return {{0,-c/b},{1,-(a+c)/b}};
            }else{
                return {{1,-(a+c)/b},{0,-c/b}};
            }
        }
    }
}

// ax+by+c>=0 convex_cut用の2点
// a=b=0のときは雑にINF

void solve(){
    vector<array<ll,3>> P(4);
    for(int i=0;i<4;i++){
        for(int j=0;j<2;j++) cin>>P[i][j];
        if(i%2==0) cin>>P[i][2];
    }
    
    array<ll,3> D;
    for(int j=0;j<3;j++) D[j]=P[2][j]-P[0][j];
    
    ll nai1=0,nai2=0;
    for(int j=0;j<3;j++){
        nai1+=P[1][j]*D[j];
        nai2+=P[3][j]*D[j];
    }
    if(nai1==0&&nai2==0){
        cout<<2<<"\n";
        return;
    }
    Line l1,l2;
    l1.p1={(double)P[0][0],(double)P[0][1]};
    l1.p2={(double)P[0][0]-P[1][1],(double)P[0][1]+P[1][0]};
    
    l2.p1={(double)P[2][0],(double)P[2][1]};
    l2.p2={(double)P[2][0]-P[3][1],(double)P[2][1]+P[3][0]};
    
    if(isParallel(l1,l2)) cout<<4<<"\n";
    else{
        auto p=getCrossPointL(l1,l2);
        double a=0,b=0,c=0;
        
        double aa=getDistance(l1.p1,p),bb=getDistance(l2.p1,p);
        
        //cout<<aa<<" "<<bb<<" "<<cc<<endl;
        for(int j=0;j<3;j++) c-=(P[0][j]-P[2][j])*(P[0][j]-P[2][j]);
        c+=aa*aa+bb*bb;
        c+=P[0][2]*P[0][2];
        c+=P[2][2]*P[2][2];
        
        b-=P[0][2]*2;
        b-=P[2][2]*2;
        
        a=2;
        
        //cout<<a<<" "<<b<<" "<<c<<endl;
        
        //cout<<b*b-4*a*c<<endl;
        if(b*b-4*a*c>-eps){
            cout<<3<<"\n";
        }else{
            if(ccw(l1.p1,l1.p2,l2.p1)%2==0){
                cout<<3<<"\n";
            }else if(ccw(l2.p1,l2.p2,l1.p1)%2==0){
                cout<<3<<"\n";
            }else{
                cout<<4<<"\n";
            }
        }
    }
}

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    int Q;cin>>Q;
    while(Q--){
        solve();
        
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3656kb

input:

2
-1 -1 3
1 1
2 2 3
2 2
5 5 1
3 0
7 6 -2
1 -2

output:

4
3

result:

ok 2 number(s): "4 3"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3800kb

input:

100
-13 -5 -7
-19 19
-19 -13 0
-7 15
-20 20 19
-17 18
20 -20 -1
18 -19
-18 15 -14
-19 18
19 -20 6
20 -19
-12 9 1
7 -16
-13 -14 -8
8 -13
-19 16 9
20 -19
19 -18 -11
19 -18
19 20 -8
12 20
-11 -9 18
-19 -18
8 11 -13
12 -18
18 13 8
4 -18
-16 20 17
-19 18
20 -18 -3
20 -19
-17 -20 -5
-18 -19
19 16 15
19 20...

output:

4
4
4
4
4
4
3
4
4
4
3
4
4
3
3
4
3
4
4
4
4
4
4
4
4
4
4
4
3
3
3
4
4
4
4
4
4
4
4
4
4
4
4
4
3
4
4
4
4
4
3
4
3
4
4
4
3
4
4
4
4
4
4
4
3
4
3
4
4
4
4
4
4
4
4
4
4
4
4
3
4
4
4
4
4
4
4
3
3
4
3
4
4
4
4
4
4
4
4
4

result:

ok 100 numbers

Test #3:

score: 0
Accepted
time: 0ms
memory: 3652kb

input:

100
20 -9 -19
9 13
-12 14 -18
-17 12
2 -3 -2
2 -19
-8 9 -15
-19 3
-16 -16 -18
2 15
19 17 -6
-10 11
14 -20 -6
-19 7
-17 -8 -1
-7 -15
7 -15 3
2 13
-15 -9 11
15 2
-17 20 13
11 -8
-12 18 16
-18 -17
-17 15 -2
-20 1
8 -6 0
-16 -19
-5 -14 16
-17 10
-7 -16 17
-10 -13
1 1 -13
17 11
-3 -3 -18
4 -17
19 -6 -17
...

output:

3
4
4
4
3
3
4
3
3
4
4
3
4
4
3
3
4
3
4
4
4
4
3
4
3
4
4
3
3
4
4
4
3
4
3
3
4
3
3
4
3
4
3
4
3
4
3
4
4
3
3
4
3
3
4
3
3
4
4
3
3
4
4
3
4
3
3
4
3
3
3
4
3
4
3
4
3
4
3
4
4
3
3
4
3
4
4
4
4
3
3
3
3
4
3
3
4
4
4
4

result:

ok 100 numbers

Test #4:

score: 0
Accepted
time: 0ms
memory: 3652kb

input:

100
10 -9 -13
8 -7
-3 3 -15
-5 11
-14 -20 -17
13 -13
3 20 16
-20 8
-2 -15 -20
8 20
20 -10 15
12 6
4 2 20
14 14
-13 6 -20
-10 20
-18 -15 19
10 9
4 18 -11
-16 -15
20 -11 6
15 -10
-17 -19 -6
-6 8
-19 -19 -18
-11 -9
-6 4 18
11 -5
2 -18 20
0 -12
-10 -18 -17
20 -20
19 19 17
2 -11
-20 2 -16
-19 13
-6 6 -5
...

output:

4
3
4
3
4
4
3
3
3
4
4
3
3
3
4
4
3
3
3
4
4
4
3
4
3
3
3
3
4
4
3
4
4
3
4
3
3
4
4
3
3
3
4
4
3
4
4
4
4
4
3
4
3
4
4
4
3
4
4
3
4
4
3
3
3
4
3
3
3
3
4
4
4
4
3
4
4
3
4
3
4
3
3
3
4
4
3
4
3
4
4
3
4
3
4
4
3
3
4
4

result:

ok 100 numbers

Test #5:

score: 0
Accepted
time: 0ms
memory: 3724kb

input:

100
4 -19 -4
4 18
-15 20 -15
-16 18
-11 -10 -13
-7 14
20 -17 0
6 -20
-12 18 -8
3 -14
20 16 17
10 17
0 19 -17
-11 6
18 -19 -7
13 -13
-17 17 -17
-5 -1
17 -13 19
-10 -12
9 -3 -19
-12 -2
-16 11 13
12 -8
17 12 11
-1 20
13 -14 -5
-4 16
-20 8 -16
16 -3
9 -3 -6
14 -12
16 4 9
-16 -10
-15 -3 -17
-20 -2
20 2 1...

output:

4
4
3
4
3
4
4
4
4
4
3
4
3
4
3
3
4
3
3
4
3
4
3
3
4
4
4
4
4
3
3
4
3
4
3
4
4
4
4
4
3
4
4
4
3
4
4
4
4
4
4
4
4
3
4
4
4
4
4
3
3
3
4
4
4
4
4
3
3
4
3
4
4
4
4
3
4
4
3
4
3
4
3
4
4
4
4
4
4
3
4
3
4
4
4
4
3
4
4
4

result:

ok 100 numbers

Test #6:

score: 0
Accepted
time: 0ms
memory: 3640kb

input:

100
-1 -13 -13
-14 -8
-1 -3 15
6 -14
19 -1 -16
-20 -14
-16 12 18
20 17
-19 17 -6
16 13
15 -8 18
16 10
17 20 0
0 -13
-19 -19 15
-14 -14
-11 -16 17
17 18
0 2 -10
20 -5
-8 -16 0
3 12
-19 0 -3
1 -14
-18 3 -12
-14 -15
20 1 17
20 -4
-20 6 20
20 -7
20 1 -9
-13 -4
2 17 -18
11 13
8 16 14
-12 16
-11 12 -20
0 ...

output:

3
4
4
4
3
4
4
4
3
4
4
4
3
4
3
4
3
4
3
3
4
4
3
3
3
4
4
4
3
3
4
4
4
3
4
4
4
4
3
3
4
4
4
4
4
4
3
4
4
3
3
3
4
3
3
4
4
4
3
4
4
3
3
3
3
4
4
4
4
3
3
3
4
4
3
4
3
3
4
3
3
4
3
4
4
3
3
3
4
4
3
3
4
3
3
3
3
3
4
3

result:

ok 100 numbers

Test #7:

score: 0
Accepted
time: 0ms
memory: 3604kb

input:

100
-16 0 17
16 16
16 -12 -16
14 12
19 -13 -20
-16 -8
-14 20 14
-6 -20
6 -19 12
18 -2
7 20 -19
3 -20
19 -5 12
-16 -12
-9 -11 0
19 4
11 -20 12
14 -14
-19 16 1
-12 -1
-8 -14 11
-15 2
9 -11 18
4 20
-14 3 -16
-20 -4
11 -16 7
-10 -11
20 16 -19
-10 8
-20 0 13
-17 -8
20 -17 2
14 -2
-17 13 7
-8 -11
-8 -6 -2...

output:

4
3
3
4
4
3
3
4
3
3
3
4
3
4
4
4
4
4
4
4
4
4
4
4
4
3
4
4
4
4
4
3
4
4
3
4
3
4
4
4
4
4
4
3
4
3
4
4
4
3
3
3
4
4
4
3
4
4
4
3
4
3
4
4
4
4
4
4
3
3
3
4
3
4
4
4
3
4
4
3
3
4
3
4
3
4
4
3
4
3
4
3
4
3
4
3
3
4
3
4

result:

ok 100 numbers

Test #8:

score: 0
Accepted
time: 0ms
memory: 3640kb

input:

1
1 -1 1
1 1
1 1 2
-1 1

output:

3

result:

ok 1 number(s): "3"

Test #9:

score: 0
Accepted
time: 0ms
memory: 3724kb

input:

100
20 19 -6
18 19
-19 -20 14
19 20
-1 19 -19
6 18
12 -20 19
18 19
4 0 -18
-19 10
-13 12 7
-8 11
-19 -18 -9
-19 -20
18 20 11
18 19
-19 19 8
18 -19
18 -19 -12
-19 20
11 12 9
-15 -2
-12 -12 -4
3 11
-19 9 -10
-18 3
-3 -19 4
20 11
-19 -20 10
-20 -19
17 20 -10
19 18
-17 -20 14
19 20
17 20 -6
-18 -19
9 -1...

output:

4
4
4
4
4
4
3
4
4
3
4
4
4
4
3
4
4
3
4
4
4
4
3
4
4
4
4
3
4
4
3
4
4
3
3
4
4
4
4
4
4
4
4
4
4
3
4
4
3
4
3
4
4
4
4
3
3
4
4
4
3
3
4
4
3
4
3
3
4
3
4
3
4
4
4
4
4
4
4
3
4
4
3
4
4
3
4
4
4
4
4
4
4
4
4
3
4
4
4
4

result:

ok 100 numbers

Test #10:

score: 0
Accepted
time: 0ms
memory: 3788kb

input:

100
13 -13 12
5 12
12 20 14
-14 -8
18 -17 -5
-1 -17
-10 9 9
-10 18
13 -17 -1
19 -18
11 1 -2
-17 -18
16 19 -17
-8 6
-14 -1 16
-18 6
4 -14 18
-10 14
13 3 12
-1 -14
-20 1 -11
12 15
20 4 -20
-7 -17
8 -19 1
-9 -10
-19 8 -4
-17 18
6 -14 -12
-12 -5
-12 6 19
-18 -11
-16 -16 -10
15 16
12 18 -9
-17 16
-18 5 -...

output:

4
4
4
4
4
4
4
4
4
4
4
4
4
3
3
3
3
4
3
4
3
3
4
4
4
4
4
4
3
3
3
3
3
3
3
3
4
3
4
3
4
4
4
4
4
3
4
3
3
4
4
3
3
3
3
3
4
3
3
3
3
3
3
3
3
3
3
4
4
4
4
3
4
3
4
4
4
4
3
4
4
3
3
3
3
4
4
4
4
3
4
3
4
4
3
4
4
4
4
4

result:

ok 100 numbers

Test #11:

score: 0
Accepted
time: 0ms
memory: 3520kb

input:

73
14 -7 7
1 10
-16 -4 11
1 10
-14 -13 -16
1 -8
-6 -12 -10
-2 16
-5 -10 -12
0 -13
15 -10 0
0 -2
19 20 19
17 -9
-14 -20 -15
-20 6
3 19 4
-16 -1
5 -13 11
-16 -1
-19 -20 -17
0 11
-19 -20 -10
2 -3
-9 -15 -18
1 -13
17 -13 -11
1 -13
10 -20 17
8 -1
15 20 1
16 -2
-20 -18 8
0 -11
12 -18 17
0 -10
-4 0 10
9 0
...

output:

2
2
2
4
2
2
2
2
2
2
2
2
2
4
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
3
2
2
2
3
2
2
2
2
2
4
2
2
2
2
2
2
4
3
4
2
2
2
2
2
4
3
2
2
2
4
2
2
2
2
2
4
2
2
3
2
2

result:

ok 73 numbers

Test #12:

score: -100
Wrong Answer
time: 0ms
memory: 3556kb

input:

100
-20 -20 10
-1 1
20 20 10
-1 6
15 -19 12
-17 20
-18 20 10
17 15
7 -19 0
-16 13
18 17 -10
11 15
17 13 9
-16 15
-6 -13 14
-13 -20
-19 2 13
-8 13
20 -13 -12
-19 -8
-20 20 4
-11 -11
20 -20 4
10 -10
-12 3 0
12 -17
-14 20 17
12 17
6 -19 7
-11 -20
14 8 -6
17 -13
-12 10 -2
19 20
15 -15 -9
-20 3
4 19 -19
...

output:

3
3
4
3
3
3
4
3
3
4
3
3
3
3
3
4
3
4
4
4
3
3
3
4
3
4
3
3
4
4
3
3
4
3
3
3
3
3
3
3
4
3
4
4
3
3
3
4
4
3
3
3
4
3
4
4
3
3
4
4
3
4
3
3
4
3
3
4
3
3
3
3
4
3
3
4
4
4
3
4
3
3
4
3
3
3
3
3
4
3
4
3
3
4
4
4
3
4
4
3

result:

wrong answer 1st numbers differ - expected: '4', found: '3'