Cod sursa(job #2338662)

Utilizator oneorzeroOne or zero oneorzero Data 7 februarie 2019 18:04:49
Problema Lazy Scor 10
Compilator cpp-64 Status done
Runda prega_agm_grupa1_contest1 Marime 1.61 kb
#include <fstream>
#include <algorithm>

#define MAXM 200000

using namespace std;

ifstream fin( "lazy.in" );
ofstream fout( "lazy.out" );

struct Drum
{
	int x, y, c1, p;
	int c2[35];
};

int t[MAXM+5], h[MAXM+5];
Drum v[MAXM+5];

inline int getf( int k )
{
	while( t[k]!=k )
		k=t[k];

	return k;
}

inline int unionf( int a, int b )
{
	int ta=getf(a);
	int tb=getf(b);

	if( ta!=tb )
	{
		if( h[ta]==h[tb] )
		{
			h[ta]++;
			t[tb]=ta;
		}
		else
			if( h[ta]<h[tb] )
				t[ta]=tb;
			else
				t[tb]=ta;

		return 1;
	}

	return 0;
}

inline void inmultire( int v[], int a, int b )
{
	int p=1;

	while( b )
	{
		int c=b%10, ca=a, q=0, r=0;

		while( ca )
		{
			int x=(v[p+q]+(ca%10)*c+r);

			v[p+q]=x%10;
			r=x/10;

			v[0]=p+q;

			q++;
			ca/=10;
		}

		if( r>0 )
		{
			v[p+q]+=r;
			v[0]=p+q;
		}

		p++;
		b/=10;
	}
}

inline int compar( int x[], int y[] )
{
	if( x[0]<y[0] )
		return 1;
	else
		if( x[0]==y[0] )
		{
			int i=x[0], ok=1;

			while( i>=1 && ok )
			{
				ok=(x[i]==y[i]);
				i--;
			}

			if( i>=1 && x[i]<y[i] )
				return 1;

			return 0;
		}

	return 0;
}

bool cmp( Drum a, Drum b )
{
	if( a.c1==b.c1 )
		return compar(a.c2,b.c2);

	return a.c1<b.c1;
}

int main()
{
	int n, m;

	fin>>n>>m;

	for( int i=1;i<=m;i++ )
	{
		int k;

		fin>>v[i].x>>v[i].y>>v[i].c1>>k;

		inmultire(v[i].c2,v[i].c1,k);

		v[i].p=i;
	}

	for( int i=1;i<=n;i++ )
		t[i]=h[i]=i;

	sort(v+1,v+m+1,cmp);

	for( int i=1;i<=m;i++ )
		if( unionf(v[i].x,v[i].y) )
			fout<<v[i].p<<"\n";

	return 0;
}