Cod sursa(job #1247859)

Utilizator ZenusTudor Costin Razvan Zenus Data 24 octombrie 2014 11:09:17
Problema Felinare Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.86 kb
#include <cstdio>
#include <set>

using namespace std;

#define F first
#define S second
#define NMAX 9000

struct node_inf
{
    int value;
    int index;
};

set < int > G[NMAX],Ginv[NMAX];
node_inf T_intern[4*NMAX],T_extern[4*NMAX];
int N,M,i,X,Y,step,left,f;
pair < int , int > marked[NMAX];

void Build_intern(int node,int left,int right)
{
    if (left==right) return ;

    Build_intern(2*node,left,(left+right)/2);
    Build_intern(2*node+1,(left+right)/2+1,right);

    T_intern[node] = (T_intern[2*node].value>T_intern[2*node+1].value) ? T_intern[2*node] : T_intern[2*node+1];
}

void Build_extern(int node,int left,int right)
{
    if (left==right) return ;

    Build_extern(2*node,left,(left+right)/2);
    Build_extern(2*node+1,(left+right)/2+1,right);

     T_extern[node] = (T_extern[2*node].value>T_extern[2*node+1].value) ? T_extern[2*node] : T_extern[2*node+1];
}

void Update_intern(int node)
{
    if (node==0) return ;

    T_intern[node] = (T_intern[2*node].value>T_intern[2*node+1].value) ? T_intern[2*node] : T_intern[2*node+1];
    Update_intern(node/2);
}

void Update_extern(int node)
{
    if (node==0) return ;

    T_extern[node] = (T_extern[2*node].value>T_extern[2*node+1].value) ? T_extern[2*node] : T_extern[2*node+1];
    Update_extern(node/2);
}

int main()
{
freopen("felinare.in","r",stdin);
freopen("felinare.out","w",stdout);

scanf("%d%d",&N,&M);

step=1;
while (step<N) step<<=1;
--step;

for (;M;--M)
{
    scanf("%d%d",&X,&Y);

    G[X].insert(Y);
    Ginv[Y].insert(X);

    ++T_intern[step+Y].value;
    ++T_extern[step+X].value;
}

for (i=1;i<=N;++i)
{
    T_intern[step+i].index=T_extern[step+i].index=i;
    marked[i]=make_pair(2,1);
}

Build_intern(1,1,N);
Build_extern(1,1,N);
left=2*N;

while (T_intern[1].value || T_extern[1].value)
if (T_intern[1].value>T_extern[1].value)
{
    marked[T_intern[1].index].F=0;
    --left;

    while (!Ginv[T_intern[1].index].empty())
    {
        f=*Ginv[T_intern[1].index].begin();
        Ginv[T_intern[1].index].erase(Ginv[T_intern[1].index].begin());
        G[f].erase(G[f].find(T_intern[1].index));

        --T_extern[step+f].value;
        Update_extern((step+f)/2);
    }

    T_intern[step+T_intern[1].index].value=0;
    Update_intern((step+T_intern[1].index)/2);
}
else
{
    marked[T_extern[1].index].S=0;
    --left;

    while (!G[T_extern[1].index].empty())
    {
        f=*G[T_extern[1].index].begin();
        G[T_extern[1].index].erase(G[T_extern[1].index].begin());
        Ginv[f].erase(Ginv[f].find(T_extern[1].index));

        --T_intern[step+f].value;
        Update_intern((step+f)/2);
    }

    T_extern[step+T_extern[1].index].value=0;
    Update_extern((step+T_extern[1].index)/2);
}

for (printf("%d\n",left),i=1;i<=N;++i)
printf("%d\n",marked[i].F+marked[i].S);

return 0;
}