/*
对于连续的三个点p0,p1,p2,另向量a=p1-p0,b=p2-p1
若是凸多边形,那么b相对于a一定是向逆时针方向旋转的
判断两向量的旋转方向,可以使用向量的叉积 a×b = x1×y2 - x2×y1
a×b > 0 b在a的逆时针方向
a×b = 0 b平行于a(共线)
a×b < 0 b在a的顺时针方向
要注意的是,对于最后一个点pn,还要和起始的两个点p0,p1判断一次。
*/
#include<iostream>
using namespace std;
struct Point
{
int x;
int y;
}df[1001];
int det(int x1, int y1, int x2, int y2)
{
return x1 * y2 - x2 * y1;
}
int cross(Point p0, Point p1, Point p2)
{
int x1 = p1.x - p0.x;
int y1 = p1.y - p0.y;//一开始把这个写成int y1 = p1.y = p0.y; wrong 两次
int x2 = p2.x - p1.x;
int y2 = p2.y - p1.y;
return det(x1, y1, x2, y2);
}
int main()
{
int n, i;
bool flag;
while(cin>>n && n)
{
if(n < 3)
{
for(i = 0; i < n; i++)
cin>>df[i].x>>df[i].y;
puts("convex");
continue;
}
for(i = 0; i < n; i++)
cin>>df[i].x>>df[i].y;
df[n].x = df[0].x;
df[n].y = df[0].y;
df[n + 1].x = df[1].x;
df[n + 1].y = df[1].y;
flag = false;
int a;
for(i = 2; i <= n + 1; i++)
{
a = cross(df[i - 2], df[i - 1], df[i]);
if(a >= 0 )
continue;
else
{
flag = true;
break;
}
}
if(flag)
{
puts("concave");
}
else
{
puts("convex");
}
}
}