ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1126. Магнитные бури

Why Time Limit? complexity (n-m)*log(m)
Послано Marko Tintor (marko@pkj.co.yu) 20 июл 2002 17:55
Idea:
Using pointer connected heap and queue.
Heap for maximum element.
Queue to find element what needs to be extracted from heap.

#include <fstream.h>
ifstream fin("magnetic.dat");
//#define fin cin
const int max=14001;
short m, value[max], queue[max], heap[max+1], s,c,a;

void heap_swap(short a, short b)
{
    short x;
    x=heap[a];
    heap[a]=heap[b];
    heap[b]=x;

    x=queue[heap[a]];
    queue[heap[a]]=queue[heap[b]];
    queue[heap[b]]=x;
}

void push()
{
    short e=(s+c)%max;
    value[e]=a;
    queue[e]=++c;
    heap[c]=e;

    short k=c;
    while(k>1 && value[heap[k>>1]]<value[heap[k]])
    {
        heap_swap(k>>1,k);
        k=k>>1;
    }
}

void pop()
{
    cout << value[heap[1]] << endl;
    short k=queue[s];
    s++; s%=max;
    heap_swap(k,c--);

    while(k>1 && value[heap[k>>1]]<value[heap[k]])
    {
        heap_swap(k>>1,k);
        k=k>>1;
    }

    short l=k<<1, m;
    while(l<=c)
    {
        m=k;
        if(value[heap[l]]>value[heap[m]]) m=l;
        if(l+1<=c && value[heap[l+1]]>value[heap[m]]) m=l+1;

        if(m==k) break;
        heap_swap(m,k);
        k=m; l=k<<1;
    }
}

void main()
{
    fin >> m;
    for(int i=0; i<m; i++) {fin >> a; push();}
    while(1)
    {
        pop();
        fin >> a; if(a==-1) break;
        push();
    }
}