#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct no{
int pontuacao, id;
struct no *dir, *esq, *pai;
}No;
No *cria_no(int nova_pontuacao, int ID){
No
*novo
= malloc(sizeof(No
)); novo->pontuacao = nova_pontuacao;
novo->dir = novo->esq = NULL;
novo->id = ID;
novo->pai = NULL;
return novo;
}
No *insere_no(No *raiz, int nova_pontuacao, int ID){
No *pai_aux = NULL;
No *aux = NULL;
No *nova = cria_no(nova_pontuacao, ID);
if (raiz == NULL)
raiz = nova;
else
{
aux = raiz;
while (aux != NULL)
{
pai_aux = aux;
if (nova_pontuacao < aux->pontuacao)
aux = aux->esq;
else
aux = aux->dir;
}
nova->pai = pai_aux;
if (nova_pontuacao > pai_aux->pontuacao)
pai_aux->dir = nova;
else
pai_aux->esq = nova;
}
return raiz;
}
void em_ordem(No *raiz)
{
if (raiz != NULL)
{
em_ordem(raiz->esq);
printf("%d ", raiz
->pontuacao
); em_ordem(raiz->dir);
}
}
void pre_ordem(No *raiz)
{
if (raiz != NULL)
{
printf("%d ", raiz
->pontuacao
); pre_ordem(raiz->esq);
pre_ordem(raiz->dir);
}
}
No* sucessor(No *no_remover)
{
// por sucessor
No *suc = no_remover->dir;
while (suc->esq != NULL)
{
suc = suc->esq;
}
return suc;
}
No* antecessor(No *no_remover)
{
// por sucessor
No *ant = no_remover->esq;
while (ant->dir != NULL)
{
ant = ant->dir;
}
return ant;
}
No *remove_noavl(No *raiz, int chave)
{
No *no_remover = raiz;
No *pai_no_remover = NULL;
No *copia = NULL;
while (no_remover != NULL && no_remover->pontuacao != chave)
{
if (no_remover->pontuacao < chave)
no_remover = no_remover->dir;
else
no_remover = no_remover->esq;
}
while (no_remover != NULL) // encontrou o valor a ser removido
{
if (no_remover->esq == NULL && no_remover->dir == NULL)//eh folha
{
if (raiz == no_remover)
{
no_remover = raiz = NULL;
}
else
{
if (no_remover->pai->esq != NULL && no_remover->pai->esq->pontuacao == chave)
no_remover->pai->esq = NULL;
else
no_remover->pai->dir = NULL;
no_remover = NULL;
}
}
else // tem um filho ou dois filhos
{
if (no_remover->dir != NULL)
copia = sucessor(no_remover);
else
copia = antecessor(no_remover);
//substitui o valor da ser removido pelo valor
//do sucessor ou do antecessor
no_remover->pontuacao = copia->pontuacao;
no_remover->id = copia->id;
//muda o no a ser removido para o sucessor ou antecessor
no_remover = copia;
chave = copia->pontuacao;
}
}
return raiz;
}
No* registrar(No *raiz){
int pontuacao;
int id;
return insere_no(raiz, pontuacao, id);
}
int verifica_existencia(No*raiz, int id, int *pontuacao_velha, int*flag){
if(raiz != NULL && (*flag) != 1){
verifica_existencia(raiz->dir, id, pontuacao_velha, flag);
if(raiz->id == id){
(*flag) = 1;
(*pontuacao_velha) = raiz->pontuacao;
}
verifica_existencia(raiz->esq, id, pontuacao_velha, flag);
}
}
No* UPDATE(No *raiz){
int pontuacao_nova, pontuacao_velha, id, flag = 0;
scanf("%d", &pontuacao_nova
);
if(raiz != NULL){
verifica_existencia(raiz, id, &pontuacao_velha, &flag);
if(flag == 1){
raiz = remove_noavl(raiz, pontuacao_velha);
raiz = insere_no(raiz, pontuacao_nova, id);
}
}
return raiz;
}
int ID_MAX(No *raiz){
No* aux = raiz;
while(aux->esq != NULL)
aux = aux->esq;
return aux->id;
}
void posicao_calc(No *raiz, int id, int *CAT, int *flag){
if(raiz != NULL && (*flag) != 1){
posicao_calc(raiz->dir, id, CAT, flag);
if(raiz->id == id){
(*flag) = 1;
(*CAT)++;
}
else if((*flag) != 1){
(*CAT)++;
}
posicao_calc(raiz->esq, id, CAT, flag);
}
}
void posicao(No *raiz){
int id = 0;
if(raiz != NULL){
int rez_01, rez_02, aux_id, pos;
rez_01 = rez_02 = aux_id = pos = 0;
aux_id = ID_MAX(raiz);
posicao_calc(raiz, id, &rez_01, &pos);
pos = 0;
posicao_calc(raiz, aux_id, &rez_02, &pos);
if(rez_01>rez_02)
else
}
else{
}
}
void top(No *raiz){
if(raiz != NULL){
No* aux = raiz, *pai_aux = NULL;
while(aux != NULL){
pai_aux = aux;
aux = aux->dir;
}
}
else{
}
}
void BOTTOM(No *raiz){
if(raiz != NULL){
No* aux = raiz, *pai_aux = NULL;
while(aux != NULL){
pai_aux = aux;
aux = aux->esq;
}
}
else{
}
}
void RANGE_CALC(No *raiz, int pont_min, int pont_max){
if(raiz != NULL){
RANGE_CALC(raiz->esq, pont_min, pont_max);
if(pont_min <= raiz->pontuacao && raiz->pontuacao <= pont_max){
}
RANGE_CALC(raiz->dir, pont_min, pont_max);
}
}
void RANGE(No *raiz){
int min;
int max;
min = max = 0;
scanf("%d %d", &min
, &max
); if(raiz != NULL){
RANGE_CALC(raiz, min, max);
}
else
}
void COUNT_ABOVE(No *raiz, int ac, int* cont_0x){
if (raiz != NULL)
{
COUNT_ABOVE(raiz->dir, ac, cont_0x);
if(raiz->pontuacao > ac)
(*cont_0x)++;
COUNT_ABOVE(raiz->esq, ac, cont_0x);
}
}
void COUNT_BELOW(No *raiz, int ac, int* cont_0x){
if (raiz != NULL)
{
COUNT_BELOW(raiz->dir, ac, cont_0x);
if(raiz->pontuacao < ac)
(*cont_0x)++;
COUNT_BELOW(raiz->esq, ac, cont_0x);
}
}
int main(){
No *ABB = NULL;
int n, cont = 0;
int ac = 0;
int cont_02 = 0;
char rep[20];
while(cont < n){
if(strcmp(rep
, "REGISTER") == 0) ABB = registrar(ABB);
else if(strcmp(rep
, "UPDATE") == 0) ABB = UPDATE(ABB);
else if(strcmp(rep
, "POSITION") == 0) posicao(ABB);
else if(strcmp(rep
, "RANGE") == 0) RANGE(ABB);
else if(strcmp(rep
, "TOP") == 0) top(ABB);
else if(strcmp(rep
, "BOTTOM") == 0) BOTTOM(ABB);
else if(strcmp(rep
, "COUNT_ABOVE") == 0){ ac = cont_02 = 0;
COUNT_ABOVE(ABB, ac, &cont_02);
}
else if(strcmp(rep
, "COUNT_BELOW") == 0){ ac = cont_02 = 0;
COUNT_BELOW(ABB, ac, &cont_02);
}
cont++;
}
return 0;}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3Qgbm97CiAgICBpbnQgcG9udHVhY2FvLCBpZDsKICAgIHN0cnVjdCBubyAqZGlyLCAqZXNxLCAqcGFpOwp9Tm87CgpObyAqY3JpYV9ubyhpbnQgbm92YV9wb250dWFjYW8sIGludCBJRCl7CiAgICBObyAqbm92byA9IG1hbGxvYyhzaXplb2YoTm8pKTsKICAgIG5vdm8tPnBvbnR1YWNhbyA9IG5vdmFfcG9udHVhY2FvOwogICAgbm92by0+ZGlyID0gbm92by0+ZXNxID0gTlVMTDsKICAgIG5vdm8tPmlkID0gSUQ7CiAgICBub3ZvLT5wYWkgPSBOVUxMOwogICAgcmV0dXJuIG5vdm87Cn0KCk5vICppbnNlcmVfbm8oTm8gKnJhaXosIGludCBub3ZhX3BvbnR1YWNhbywgaW50IElEKXsKICAgIE5vICpwYWlfYXV4ID0gTlVMTDsKICAgIE5vICphdXggPSBOVUxMOwogICAgTm8gKm5vdmEgPSBjcmlhX25vKG5vdmFfcG9udHVhY2FvLCBJRCk7CiAgICBpZiAocmFpeiA9PSBOVUxMKQogICAgICAgIHJhaXogPSBub3ZhOwogICAgZWxzZQogICAgewogICAgICAgIGF1eCA9IHJhaXo7CiAgICAgICAgd2hpbGUgKGF1eCAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgcGFpX2F1eCA9IGF1eDsKICAgICAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgYXV4LT5wb250dWFjYW8pCiAgICAgICAgICAgICAgICBhdXggPSBhdXgtPmVzcTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYXV4ID0gYXV4LT5kaXI7CiAgICAgICAgfQogICAgICAgIG5vdmEtPnBhaSA9IHBhaV9hdXg7CiAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvID4gcGFpX2F1eC0+cG9udHVhY2FvKQogICAgICAgICAgICBwYWlfYXV4LT5kaXIgPSBub3ZhOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgIHBhaV9hdXgtPmVzcSA9IG5vdmE7CiAgICB9CiAgICByZXR1cm4gcmFpejsKfQoKdm9pZCBlbV9vcmRlbShObyAqcmFpeikKewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBlbV9vcmRlbShyYWl6LT5lc3EpOwogICAgICAgIHByaW50ZigiJWQgIiwgcmFpei0+cG9udHVhY2FvKTsKICAgICAgICBlbV9vcmRlbShyYWl6LT5kaXIpOwogICAgfQp9Cgp2b2lkIHByZV9vcmRlbShObyAqcmFpeikKewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBwcmludGYoIiVkICIsIHJhaXotPnBvbnR1YWNhbyk7CiAgICAgICAgcHJlX29yZGVtKHJhaXotPmVzcSk7CiAgICAgICAgcHJlX29yZGVtKHJhaXotPmRpcik7CiAgICB9Cn0KCk5vKiBzdWNlc3NvcihObyAqbm9fcmVtb3ZlcikKewoKICAgIC8vIHBvciBzdWNlc3NvcgogICAgTm8gKnN1YyA9IG5vX3JlbW92ZXItPmRpcjsKCiAgICB3aGlsZSAoc3VjLT5lc3EgIT0gTlVMTCkKICAgIHsKICAgICAgICBzdWMgPSBzdWMtPmVzcTsKICAgIH0KCiAgICByZXR1cm4gc3VjOwp9CgpObyogYW50ZWNlc3NvcihObyAqbm9fcmVtb3ZlcikKewoKICAgIC8vIHBvciBzdWNlc3NvcgogICAgTm8gKmFudCA9IG5vX3JlbW92ZXItPmVzcTsKCiAgICB3aGlsZSAoYW50LT5kaXIgIT0gTlVMTCkKICAgIHsKICAgICAgICBhbnQgPSBhbnQtPmRpcjsKICAgIH0KCiAgICByZXR1cm4gYW50Owp9CgpObyAqcmVtb3ZlX25vYXZsKE5vICpyYWl6LCBpbnQgY2hhdmUpCnsKCiAgICBObyAqbm9fcmVtb3ZlciA9IHJhaXo7CiAgICBObyAqcGFpX25vX3JlbW92ZXIgPSBOVUxMOwogICAgTm8gKmNvcGlhID0gTlVMTDsKCiAgICB3aGlsZSAobm9fcmVtb3ZlciAhPSBOVUxMICYmIG5vX3JlbW92ZXItPnBvbnR1YWNhbyAhPSBjaGF2ZSkKICAgIHsKICAgICAgICBpZiAobm9fcmVtb3Zlci0+cG9udHVhY2FvIDwgY2hhdmUpCiAgICAgICAgICAgIG5vX3JlbW92ZXIgPSBub19yZW1vdmVyLT5kaXI7CiAgICAgICAgZWxzZQogICAgICAgICAgICBub19yZW1vdmVyID0gbm9fcmVtb3Zlci0+ZXNxOwogICAgfQoKICAgIHdoaWxlIChub19yZW1vdmVyICE9IE5VTEwpIC8vIGVuY29udHJvdSBvIHZhbG9yIGEgc2VyIHJlbW92aWRvCiAgICB7CiAgICAgICAgaWYgKG5vX3JlbW92ZXItPmVzcSA9PSBOVUxMICYmIG5vX3JlbW92ZXItPmRpciA9PSBOVUxMKS8vZWggZm9saGEKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyYWl6ID09IG5vX3JlbW92ZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZyZWUocmFpeik7CiAgICAgICAgICAgICAgICBub19yZW1vdmVyID0gcmFpeiA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAobm9fcmVtb3Zlci0+cGFpLT5lc3EgIT0gTlVMTCAmJiBub19yZW1vdmVyLT5wYWktPmVzcS0+cG9udHVhY2FvID09IGNoYXZlKQogICAgICAgICAgICAgICAgICAgIG5vX3JlbW92ZXItPnBhaS0+ZXNxID0gTlVMTDsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBub19yZW1vdmVyLT5wYWktPmRpciA9IE5VTEw7CgogICAgICAgICAgICAgICAgZnJlZShub19yZW1vdmVyKTsKICAgICAgICAgICAgICAgIG5vX3JlbW92ZXIgPSBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgLy8gdGVtIHVtIGZpbGhvIG91IGRvaXMgZmlsaG9zCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKG5vX3JlbW92ZXItPmRpciAhPSBOVUxMKQogICAgICAgICAgICAgICAgY29waWEgPSBzdWNlc3Nvcihub19yZW1vdmVyKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY29waWEgPSBhbnRlY2Vzc29yKG5vX3JlbW92ZXIpOwoKICAgICAgICAgICAgICAgIC8vc3Vic3RpdHVpIG8gdmFsb3IgZGEgc2VyIHJlbW92aWRvIHBlbG8gdmFsb3IKICAgICAgICAgICAgICAgIC8vZG8gc3VjZXNzb3Igb3UgZG8gYW50ZWNlc3NvcgogICAgICAgICAgICBub19yZW1vdmVyLT5wb250dWFjYW8gPSBjb3BpYS0+cG9udHVhY2FvOwogICAgICAgICAgICBub19yZW1vdmVyLT5pZCA9IGNvcGlhLT5pZDsKICAgICAgICAgICAgLy9tdWRhIG8gbm8gYSBzZXIgcmVtb3ZpZG8gcGFyYSBvIHN1Y2Vzc29yIG91IGFudGVjZXNzb3IKICAgICAgICAgICAgbm9fcmVtb3ZlciA9IGNvcGlhOwogICAgICAgICAgICBjaGF2ZSA9IGNvcGlhLT5wb250dWFjYW87CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgcmV0dXJuIHJhaXo7Cn0KCk5vKiByZWdpc3RyYXIoTm8gKnJhaXopewogICAgaW50IHBvbnR1YWNhbzsKICAgIGludCBpZDsKICAgIHNjYW5mKCIlZCIsICZpZCk7CiAgICBzY2FuZigiJWQiLCAmcG9udHVhY2FvKTsKICAgIHJldHVybiBpbnNlcmVfbm8ocmFpeiwgcG9udHVhY2FvLCBpZCk7Cn0KCmludCB2ZXJpZmljYV9leGlzdGVuY2lhKE5vKnJhaXosIGludCBpZCwgaW50ICpwb250dWFjYW9fdmVsaGEsIGludCpmbGFnKXsKICAgIGlmKHJhaXogIT0gTlVMTCAmJiAoKmZsYWcpICE9IDEpewogICAgICAgIHZlcmlmaWNhX2V4aXN0ZW5jaWEocmFpei0+ZGlyLCBpZCwgcG9udHVhY2FvX3ZlbGhhLCBmbGFnKTsKICAgICAgICBpZihyYWl6LT5pZCA9PSBpZCl7CiAgICAgICAgICAgICgqZmxhZykgPSAxOwogICAgICAgICAgICAoKnBvbnR1YWNhb192ZWxoYSkgPSByYWl6LT5wb250dWFjYW87CiAgICAgICAgfQogICAgICAgIHZlcmlmaWNhX2V4aXN0ZW5jaWEocmFpei0+ZXNxLCBpZCwgcG9udHVhY2FvX3ZlbGhhLCBmbGFnKTsKICAgIH0KfQoKTm8qIFVQREFURShObyAqcmFpeil7CiAgICBpbnQgcG9udHVhY2FvX25vdmEsIHBvbnR1YWNhb192ZWxoYSwgaWQsIGZsYWcgPSAwOwoKICAgIHNjYW5mKCIlZCIsICZpZCk7CiAgICBzY2FuZigiJWQiLCAmcG9udHVhY2FvX25vdmEpOwogICAgCiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIHZlcmlmaWNhX2V4aXN0ZW5jaWEocmFpeiwgaWQsICZwb250dWFjYW9fdmVsaGEsICZmbGFnKTsKCiAgICAgICAgaWYoZmxhZyA9PSAxKXsKICAgICAgICAgICAgcmFpeiA9IHJlbW92ZV9ub2F2bChyYWl6LCBwb250dWFjYW9fdmVsaGEpOwogICAgICAgICAgICByYWl6ID0gaW5zZXJlX25vKHJhaXosIHBvbnR1YWNhb19ub3ZhLCBpZCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJhaXo7Cn0KCmludCBJRF9NQVgoTm8gKnJhaXopewogICAgTm8qIGF1eCA9IHJhaXo7CiAgICB3aGlsZShhdXgtPmVzcSAhPSBOVUxMKQogICAgICAgIGF1eCA9IGF1eC0+ZXNxOwogICAgcmV0dXJuIGF1eC0+aWQ7Cn0KCnZvaWQgcG9zaWNhb19jYWxjKE5vICpyYWl6LCBpbnQgaWQsIGludCAqQ0FULCBpbnQgKmZsYWcpewogICAgaWYocmFpeiAhPSBOVUxMICYmICgqZmxhZykgIT0gMSl7CiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXotPmRpciwgaWQsIENBVCwgZmxhZyk7CiAgICAgICAgaWYocmFpei0+aWQgPT0gaWQpewogICAgICAgICAgICAoKmZsYWcpID0gMTsKICAgICAgICAgICAgKCpDQVQpKys7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoKCpmbGFnKSAhPSAxKXsKICAgICAgICAgICAgKCpDQVQpKys7CiAgICAgICAgfQogICAgICAgIHBvc2ljYW9fY2FsYyhyYWl6LT5lc3EsIGlkLCBDQVQsIGZsYWcpOwogICAgfQp9Cgp2b2lkIHBvc2ljYW8oTm8gKnJhaXopewogICAgaW50IGlkID0gMDsKICAgIHNjYW5mKCIlZCIsICZpZCk7CiAgICAKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgaW50IHJlel8wMSwgcmV6XzAyLCBhdXhfaWQsIHBvczsKICAgICAgICByZXpfMDEgPSByZXpfMDIgPSBhdXhfaWQgPSBwb3MgPSAwOwoKICAgICAgICBhdXhfaWQgPSBJRF9NQVgocmFpeik7CgogICAgICAgIHBvc2ljYW9fY2FsYyhyYWl6LCBpZCwgJnJlel8wMSwgJnBvcyk7CgogICAgICAgIHBvcyA9IDA7CgogICAgICAgIHBvc2ljYW9fY2FsYyhyYWl6LCBhdXhfaWQsICZyZXpfMDIsICZwb3MpOwoKICAgICAgICBpZihyZXpfMDE+cmV6XzAyKQogICAgICAgICAgICBwcmludGYoIk5PVF9GT1VORFxuIik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBwcmludGYoIiVkXG4iLCByZXpfMDEpOwogICAgfQogICAgZWxzZXsKICAgICAgICBwcmludGYoIk5PVF9GT1VORFxuIik7CiAgICB9CiAgICAKfQoKdm9pZCB0b3AoTm8gKnJhaXopewogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBObyogYXV4ID0gcmFpeiwgKnBhaV9hdXggPSBOVUxMOwogICAgICAgIHdoaWxlKGF1eCAhPSBOVUxMKXsKICAgICAgICAgICAgcGFpX2F1eCA9IGF1eDsKICAgICAgICAgICAgYXV4ID0gYXV4LT5kaXI7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiJWRcbiIsIHBhaV9hdXgtPmlkKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgcHJpbnRmKCJFTVBUWVxuIik7CiAgICB9Cn0KCnZvaWQgQk9UVE9NKE5vICpyYWl6KXsKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgTm8qIGF1eCA9IHJhaXosICpwYWlfYXV4ID0gTlVMTDsKICAgICAgICB3aGlsZShhdXggIT0gTlVMTCl7CiAgICAgICAgICAgIHBhaV9hdXggPSBhdXg7CiAgICAgICAgICAgIGF1eCA9IGF1eC0+ZXNxOwogICAgICAgIH0KICAgICAgICBwcmludGYoIiVkXG4iLCBwYWlfYXV4LT5pZCk7CiAgICB9CiAgICBlbHNlewogICAgICAgIHByaW50ZigiRU1QVFlcbiIpOwogICAgfQp9Cgp2b2lkIFJBTkdFX0NBTEMoTm8gKnJhaXosIGludCBwb250X21pbiwgaW50IHBvbnRfbWF4KXsKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgUkFOR0VfQ0FMQyhyYWl6LT5lc3EsIHBvbnRfbWluLCBwb250X21heCk7CiAgICAgICAgaWYocG9udF9taW4gPD0gcmFpei0+cG9udHVhY2FvICYmIHJhaXotPnBvbnR1YWNhbyA8PSBwb250X21heCl7CiAgICAgICAgICAgIHByaW50ZigiJWQgIiwgcmFpei0+aWQpOwogICAgICAgIH0KICAgICAgICBSQU5HRV9DQUxDKHJhaXotPmRpciwgcG9udF9taW4sIHBvbnRfbWF4KTsKICAgIH0KfQoKdm9pZCBSQU5HRShObyAqcmFpeil7CiAgICBpbnQgbWluOwogICAgaW50IG1heDsKICAgIG1pbiA9IG1heCA9IDA7CgogICAgc2NhbmYoIiVkICVkIiwgJm1pbiwgJm1heCk7CiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIFJBTkdFX0NBTEMocmFpeiwgbWluLCBtYXgpOwogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KICAgIGVsc2UKICAgICAgICBwcmludGYoIkVNUFRZXG4iKTsKfQoKdm9pZCBDT1VOVF9BQk9WRShObyAqcmFpeiwgaW50IGFjLCBpbnQqIGNvbnRfMHgpewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBDT1VOVF9BQk9WRShyYWl6LT5kaXIsIGFjLCBjb250XzB4KTsKICAgICAgICBpZihyYWl6LT5wb250dWFjYW8gPiBhYykKICAgICAgICAgICAgKCpjb250XzB4KSsrOwogICAgICAgIENPVU5UX0FCT1ZFKHJhaXotPmVzcSwgYWMsIGNvbnRfMHgpOwogICAgfQp9Cgp2b2lkIENPVU5UX0JFTE9XKE5vICpyYWl6LCBpbnQgYWMsIGludCogY29udF8weCl7CiAgICBpZiAocmFpeiAhPSBOVUxMKQogICAgewogICAgICAgIENPVU5UX0JFTE9XKHJhaXotPmRpciwgYWMsIGNvbnRfMHgpOwogICAgICAgIGlmKHJhaXotPnBvbnR1YWNhbyA8IGFjKQogICAgICAgICAgICAoKmNvbnRfMHgpKys7CiAgICAgICAgQ09VTlRfQkVMT1cocmFpei0+ZXNxLCBhYywgY29udF8weCk7CiAgICB9Cn0KCmludCBtYWluKCl7CgpObyAqQUJCID0gTlVMTDsKaW50IG4sIGNvbnQgPSAwOwppbnQgYWMgPSAwOwppbnQgY29udF8wMiA9IDA7CmNoYXIgcmVwWzIwXTsKCnNjYW5mKCIlZCIsICZuKTsKCndoaWxlKGNvbnQgPCBuKXsKICAgIHN0cmNweShyZXAsIiAiKTsKICAgIGZmbHVzaChzdGRpbik7CiAgICBzY2FuZigiJXMiLCAmcmVwKTsKCiAgICBpZihzdHJjbXAocmVwLCAiUkVHSVNURVIiKSA9PSAwKQogICAgICAgIEFCQiA9IHJlZ2lzdHJhcihBQkIpOyAKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlVQREFURSIpID09IDApCiAgICAgICAgQUJCID0gVVBEQVRFKEFCQik7ICAgIAogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiUE9TSVRJT04iKSA9PSAwKQogICAgICAgIHBvc2ljYW8oQUJCKTsKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlJBTkdFIikgPT0gMCkKICAgICAgICBSQU5HRShBQkIpOwogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiVE9QIikgPT0gMCkKICAgICAgICB0b3AoQUJCKTsKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIkJPVFRPTSIpID09IDApCiAgICAgICAgQk9UVE9NKEFCQik7CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJDT1VOVF9BQk9WRSIpID09IDApewogICAgICAgIGFjID0gY29udF8wMiA9IDA7CiAgICAgICAgc2NhbmYoIiVkIiwgJmFjKTsKICAgICAgICBDT1VOVF9BQk9WRShBQkIsIGFjLCAmY29udF8wMik7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgY29udF8wMik7CiAgICB9CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJDT1VOVF9CRUxPVyIpID09IDApewogICAgICAgIGFjID0gY29udF8wMiA9IDA7CiAgICAgICAgc2NhbmYoIiVkIiwgJmFjKTsKICAgICAgICBDT1VOVF9CRUxPVyhBQkIsIGFjLCAmY29udF8wMik7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgY29udF8wMik7CiAgICB9CiAgICBjb250Kys7Cn0KCnJldHVybiAwO30=