#include <stdio.h>
#define oo 1000005
#define MAX_N 100
#define NO_EDGE 0
typedef struct{
int n;
int A[MAX_N][MAX_N];
}Graph;
void init_graph(Graph *G, int n){
G->n = n;
int u,v;
for(u=1;u<=n;u++){
for(v=1;v<=n;v++){
G->A[u][v] = 0;
}
}
}
void add_edge(Graph *G, int u, int v){
G->A[u][v]++;
}
#define MAX_ELEMENTS 100
typedef int ElementType;
typedef int ElementType;
typedef struct{
ElementType data[MAX_ELEMENTS];
int size;
}List;
void make_null(List *L){
L->size = 0;
}
void push_back(List *L, ElementType x){
L->data[L->size] = x;
L->size++;
}
ElementType element_at(List *L, int i){
return L->data[i-1];
}
int count_list(List *L){
return L->size;
}
void copy_list(List *L1,List *L2){
L2->size = L1->size;
int i;
for(i=0;i< L1->size;i++){
L2->data[i] = L1->data[i];
}
}
#define MAX_SIZE 100
typedef int ElementType;
typedef struct{
ElementType data[MAX_SIZE];
int front, rear;
}Queue;
void make_null_queue(Queue *Q){
Q->front = -1;
Q->rear = -1;
}
void enqueue(Queue *Q, ElementType u){
Q->rear++;
Q->data[Q->rear]=u;
}
ElementType front(Queue *Q){
return Q->data[Q->front];
}
void dequeue(Queue *Q){
Q->front++;
}
int empty(Queue *Q){
return Q->front > Q->rear;
}
int max(int a, int b){
return (a>b)?a:b;
}
int min(int a, int b){
return (a<b)?a:b;
}
void topo_sort(Graph *G, List *L){
int d[MAX_N];
int u,x,v;
//Tinh bac vao cua u
for(u=1; u<=G->n;u++){
d[u] = 0;
for(x=1;x<=G->n;x++){
if(G->A[x][u] != 0)
d[u]++;
}
}
Queue Q;
make_null_queue(&Q);
for(u=1;u<=G->n;u++){
if(d[u]==0)
enqueue(&Q,u);
make_null(L);
while(!empty(&Q)){
int u = front(&Q);
dequeue(&Q);
push_back(L,u);
for(v=1;v<=G->n;v++){
if(G->A[u][v] != 0){
d[v]--;
if(d[v]==0)
enqueue(&Q,v);
}
}
}
}
int d[MAX_N];
int r[MAX_N];
int main(){
Graph G;
int n,u,x,v,j,i;
init_graph(&G, n+2);
int alpha = n+1, beta = n+2;
d[alpha] = 0;
for(u=1;u<=n;u++){
do{
if(x>0) add_edge(&G, x, u);
}while(x>0);
}
for(u=1;u<=n;u++){
int deg_neg = 0;
for(x=1;x<=n;x++){
if(G.A[x][u] > 0) deg_neg++;
}
if(deg_neg == 0) add_edge(&G, alpha, u);
}
for(u=1;u<=n;u++){
int deg_pos = 0;
for(v=1;v<=n;v++){
if(G.A[u][v] > 0) deg_pos++;
}
if(deg_pos==0) add_edge(&G, u, beta);
}
List L;
topo_sort(&G, &L);
int t[MAX_N];
t[alpha] = 0;
for(j=2;j<=L.size;j++){
int u = element_at(&L, j);
t[u] = -oo;
for(x=1;x<=G.n;x++){
if(G.A[x][u] > 0)
t[u] = max(t[u], t[x] + d[x]);
}
}
int T[MAX_N];
T[beta] = t[beta];
for(j=L.size-1;j>=1;j--){
int u = element_at(&L, j);
T[u] = +oo;
for(v=1;v<=G.n;v++){
if(G.A[u][v] > 0)
T[u] = min(T[u], T[v] - d[u]);
}
}
for(i=0;i<n;i++)
printf("%d %d\n", t
[i
], T
[i
]); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNkZWZpbmUgb28gMTAwMDAwNQojZGVmaW5lIE1BWF9OIDEwMAojZGVmaW5lIE5PX0VER0UgMAp0eXBlZGVmIHN0cnVjdHsKCWludCBuOwoJaW50IEFbTUFYX05dW01BWF9OXTsKfUdyYXBoOwp2b2lkIGluaXRfZ3JhcGgoR3JhcGggKkcsIGludCBuKXsKCUctPm4gPSBuOwoJaW50IHUsdjsKCWZvcih1PTE7dTw9bjt1KyspewoJCWZvcih2PTE7djw9bjt2KyspewoJCQlHLT5BW3VdW3ZdID0gMDsKCQl9Cgl9Cn0Kdm9pZCBhZGRfZWRnZShHcmFwaCAqRywgaW50IHUsIGludCB2KXsKCUctPkFbdV1bdl0rKzsKfQoKI2RlZmluZSBNQVhfRUxFTUVOVFMgMTAwCnR5cGVkZWYgaW50IEVsZW1lbnRUeXBlOwp0eXBlZGVmIGludCBFbGVtZW50VHlwZTsKdHlwZWRlZiBzdHJ1Y3R7CglFbGVtZW50VHlwZSBkYXRhW01BWF9FTEVNRU5UU107CglpbnQgc2l6ZTsKfUxpc3Q7Cgp2b2lkIG1ha2VfbnVsbChMaXN0ICpMKXsKCUwtPnNpemUgPSAwOwp9CnZvaWQgcHVzaF9iYWNrKExpc3QgKkwsIEVsZW1lbnRUeXBlIHgpewoJTC0+ZGF0YVtMLT5zaXplXSA9IHg7CglMLT5zaXplKys7Cn0KRWxlbWVudFR5cGUgZWxlbWVudF9hdChMaXN0ICpMLCBpbnQgaSl7CglyZXR1cm4gTC0+ZGF0YVtpLTFdOwp9CmludCBjb3VudF9saXN0KExpc3QgKkwpewoJcmV0dXJuIEwtPnNpemU7Cn0Kdm9pZCBjb3B5X2xpc3QoTGlzdCAqTDEsTGlzdCAqTDIpewoJTDItPnNpemUgPSBMMS0+c2l6ZTsKCWludCBpOwoJZm9yKGk9MDtpPCBMMS0+c2l6ZTtpKyspewoJCUwyLT5kYXRhW2ldID0gTDEtPmRhdGFbaV07Cgl9Cn0KI2RlZmluZSBNQVhfU0laRSAxMDAKdHlwZWRlZiBpbnQgRWxlbWVudFR5cGU7CnR5cGVkZWYgc3RydWN0ewoJRWxlbWVudFR5cGUgZGF0YVtNQVhfU0laRV07CglpbnQgZnJvbnQsIHJlYXI7Cn1RdWV1ZTsKdm9pZCBtYWtlX251bGxfcXVldWUoUXVldWUgKlEpewoJUS0+ZnJvbnQgPSAtMTsKCVEtPnJlYXIgPSAtMTsKfQp2b2lkIGVucXVldWUoUXVldWUgKlEsIEVsZW1lbnRUeXBlIHUpewoJUS0+cmVhcisrOwoJUS0+ZGF0YVtRLT5yZWFyXT11Owp9CkVsZW1lbnRUeXBlIGZyb250KFF1ZXVlICpRKXsKCXJldHVybiBRLT5kYXRhW1EtPmZyb250XTsKfQp2b2lkIGRlcXVldWUoUXVldWUgKlEpewoJUS0+ZnJvbnQrKzsKfQppbnQgZW1wdHkoUXVldWUgKlEpewoJcmV0dXJuIFEtPmZyb250ID4gUS0+cmVhcjsKfQoKaW50IG1heChpbnQgYSwgaW50IGIpewoJcmV0dXJuIChhPmIpP2E6YjsKfQppbnQgbWluKGludCBhLCBpbnQgYil7CglyZXR1cm4gKGE8Yik/YTpiOwp9CnZvaWQgdG9wb19zb3J0KEdyYXBoICpHLCBMaXN0ICpMKXsKCWludCBkW01BWF9OXTsKCWludCB1LHgsdjsKCS8vVGluaCBiYWMgdmFvIGN1YSB1Cglmb3IodT0xOyB1PD1HLT5uO3UrKyl7CgkJZFt1XSA9IDA7CgkJZm9yKHg9MTt4PD1HLT5uO3grKyl7CgkJCWlmKEctPkFbeF1bdV0gIT0gMCkKCQkJCWRbdV0rKzsKCQl9Cgl9CglRdWV1ZSBROwoJbWFrZV9udWxsX3F1ZXVlKCZRKTsKCWZvcih1PTE7dTw9Ry0+bjt1KyspewoJCWlmKGRbdV09PTApCgkJZW5xdWV1ZSgmUSx1KTsKCX1wcmludGYoImRvbmUgdVxuIik7CgltYWtlX251bGwoTCk7Cgl3aGlsZSghZW1wdHkoJlEpKXsKCQlpbnQgdSA9IGZyb250KCZRKTsKCQlkZXF1ZXVlKCZRKTsKCQlwdXNoX2JhY2soTCx1KTsKCQlmb3Iodj0xO3Y8PUctPm47disrKXsKCQkJaWYoRy0+QVt1XVt2XSAhPSAwKXsKCQkJCWRbdl0tLTsKCQkJCWlmKGRbdl09PTApCgkJCQkJZW5xdWV1ZSgmUSx2KTsKCQkJfQoJCX0KCX0KfQoKaW50IGRbTUFYX05dOwppbnQgcltNQVhfTl07CgppbnQgbWFpbigpewoJR3JhcGggRzsKCWludCBuLHUseCx2LGosaTsKCWludCBqb2IsIHRpbWU7CgkKCWZyZW9wZW4oImR0LnR4dCIsICJyIiwgc3RkaW4pOwoJc2NhbmYoIiVkIiwgJm4pOwoJaW5pdF9ncmFwaCgmRywgbisyKTsKCWludCBhbHBoYSA9IG4rMSwgYmV0YSA9IG4rMjsKCWRbYWxwaGFdID0gMDsKCWZvcih1PTE7dTw9bjt1KyspewoJCXNjYW5mKCIlZCIsICZkW3VdKTsKCQlkb3sKCQkJc2NhbmYoIiVkIiwgJngpOwoJCQlpZih4PjApIGFkZF9lZGdlKCZHLCB4LCB1KTsKCQl9d2hpbGUoeD4wKTsKCX0KCXNjYW5mKCIlZCAlZCIsICZqb2IsICZ0aW1lKTsKCWZvcih1PTE7dTw9bjt1KyspewoJCWludCBkZWdfbmVnID0gMDsKCQlmb3IoeD0xO3g8PW47eCsrKXsKCQkJaWYoRy5BW3hdW3VdID4gMCkgZGVnX25lZysrOwoJCX0KCQlpZihkZWdfbmVnID09IDApIGFkZF9lZGdlKCZHLCBhbHBoYSwgdSk7Cgl9CgkKCWZvcih1PTE7dTw9bjt1KyspewoJCWludCBkZWdfcG9zID0gMDsKCQlmb3Iodj0xO3Y8PW47disrKXsKCQkJaWYoRy5BW3VdW3ZdID4gMCkgZGVnX3BvcysrOwoJCX0KCQlpZihkZWdfcG9zPT0wKSBhZGRfZWRnZSgmRywgdSwgYmV0YSk7Cgl9CglMaXN0IEw7Cgl0b3BvX3NvcnQoJkcsICZMKTsKCQoJaW50IHRbTUFYX05dOwoJdFthbHBoYV0gPSAwOwoJCglmb3Ioaj0yO2o8PUwuc2l6ZTtqKyspewoJCWludCB1ID0gZWxlbWVudF9hdCgmTCwgaik7CgkJdFt1XSA9IC1vbzsKCQlmb3IoeD0xO3g8PUcubjt4KyspewoJCQlpZihHLkFbeF1bdV0gPiAwKQoJCQl0W3VdID0gbWF4KHRbdV0sIHRbeF0gKyBkW3hdKTsKCQl9Cgl9CglpbnQgVFtNQVhfTl07CglUW2JldGFdID0gdFtiZXRhXTsKCWZvcihqPUwuc2l6ZS0xO2o+PTE7ai0tKXsKCQlpbnQgdSA9IGVsZW1lbnRfYXQoJkwsIGopOwoJCVRbdV0gPSArb287CgkJZm9yKHY9MTt2PD1HLm47disrKXsKCQkJaWYoRy5BW3VdW3ZdID4gMCkKCQkJVFt1XSA9IG1pbihUW3VdLCBUW3ZdIC0gZFt1XSk7CgkJfQoJfQoJZm9yKGk9MDtpPG47aSsrKQoJcHJpbnRmKCIlZCAlZFxuIiwgdFtpXSwgVFtpXSk7CglyZXR1cm4gMDsKfQ==