dinic
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#define INF 11000000
struct Edge
{
int from,to,cap,flow;
Edge(int ff,int tt,int cc,int fff)
{
from=ff;to=tt;cap=cc;flow=fff;
}
};
int n;
int s,t;
vector<int> G[100000];
vector<Edge> edge;
int num[220];
int cur[100000];
int dis[100000];
void add(int from,int to,int cap)
{
edge.push_back(Edge(from,to,cap,0));
edge.push_back(Edge(to,from,0,0));
int sz=edge.size();
G[from].push_back(sz-2);
G[to].push_back(sz-1);
}
int bfs()
{
memset(dis,-1,sizeof(dis));
dis[s]=0;
queue<int> q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
int sz=G[u].size();
for(int i=0;i<sz;i++)
{
Edge e=edge[G[u][i]];
if(dis[e.to]==-1&&e.cap>e.flow)
{
dis[e.to]=dis[u]+1;
q.push(e.to);
}
}
}
if(dis[t]==-1)
return 0;
return dis[t];
}
int dfs(int u,int low)
{
if(u==t||low==0)
return low;
int sz=G[u].size(),d;
int flow=0;
for(int& i=cur[u];i<sz;i++)
{
Edge& e=edge[G[u][i]];
if(dis[e.to]==dis[u]+1&&(d=dfs(e.to,min(low,e.cap-e.flow)))>0)
{
e.flow+=d;
edge[G[u][i]^1].flow-=d;
flow+=d;
low-=d;
if(low==0)
break;
}
}
return flow;
}
int Dinic()
{
int flow=0;
while(bfs())
{
memset(cur,0,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
int main()
{
while(cin>>n)
{
s=0,t=n*(n-1)/2+n+1;
edge.clear();
for(int i=0;i<=t;i++)
G[i].clear();
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
int k=1;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
add(k,n*(n-1)/2+i,INF);
add(k,n*(n-1)/2+j,INF);
k++;
}
for(int i=1;i<=n;i++)
add(n*(n-1)/2+i,t,num[i]);
for(int i=1;i<=n*(n-1)/2;i++)
add(s,i,3);
int temp=Dinic();
if(temp==n*(n-1)/2*3)
{
printf("CORRECT\n");
int k=1;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
printf("%d ",i);
int t=edge[G[k][0]].flow;
if(t==3)
printf(">");
else
if(t==0)
printf("<");
else
if(t==1)
printf("<=");
else
printf(">=");
printf(" %d\n",j);
k++;
}
}
else
printf("INCORRECT\n");
}
return 0;
}