Cod sursa(job #23476)

Utilizator hellraizerChiperi Matei hellraizer Data 28 februarie 2007 20:19:09
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>

#define N_MAX 5001

int n,m,t[N_MAX],p[N_MAX];
long v[N_MAX],c[N_MAX];

void citire(){
	int bun;
	FILE *fin=fopen("secv.in","r");
	fscanf(fin,"%d",&n);
	for (int i=1;i<=n;i++){
		fscanf(fin,"%ld",&v[i]);
		bun=1;
		for (int j=1;j<=m;j++)
			if (c[j]==v[i])
				bun=0;
		if (bun)
			c[++m]=v[i];
	}
	fclose(fin);
}

void interclasare(int x,int m,int y){
	long b[N_MAX],k1=x,k2=m+1,k=0;
	while (k1<=m&&k2<=y)
		if (c[k1]<c[k2])
			b[++k]=c[k1++];
		else
			b[++k]=c[k2++];
	while (k1<=m)
		b[++k]=c[k1++];
	while (k2<=y)
		b[++k]=c[k2++];
	for (k1=1;k1<=k;k1++)
		c[x+k1-1]=b[k1];
}

void sortare(int x,int y){
	if (x!=y){
		int m=(x+y)/2;
		sortare(x,m);
		sortare(m+1,y);
		interclasare(x,m,y);
	}
}

void prelucrare(){
	sortare(1,m);
	long x=1;
	int j;
	for (int i=1;i<=n;i++)
		for (j=1;j<=x;j++)
			if (v[i]==c[j]){
				p[j]=i;
				if (j==1)
					t[j]=1;
				else
					t[j]=t[j-1]+p[j]-p[j-1];
				if (j==x){
					x++;
					break;
				}
			}
}

void afisare(){
	FILE *fout=fopen("secv.out","w");
	if (!t[m])
		fprintf(fout,"-1\n");
	else
		fprintf(fout,"%d\n",t[m]);
	fclose(fout);
}

int main(){
	citire();
	prelucrare();
	afisare();
	return 0;
}