Cod sursa(job #1266850)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 19 noiembrie 2014 09:18:02
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include<cstdio>
#include<cstdlib>
#include<ctime>
int n,k,i,j,v[3001000],vl[3001000],vr[3001000],p,u,mid;
FILE *f,*g;
void chg(int &a,int &b){
	int aux=a;
	a=b;
	b=aux;
}
int sdo(int l,int r){
	int st,dr,i,j,p,a;
	st=dr=0;
	p=l+rand()%(r-l+1);
	for(i=l;i<=r;i++){
		if(v[i]<v[p])
			vl[++st]=v[i];
		else if(v[i]==v[p]){
			vl[++st]=v[i];
			a=st;
		}
		else
			vr[++dr]=v[i];
	}
	chg(vl[a],vl[st]);
	for(i=l,j=1;i<=r;i++,j++){
		if(j<=st)
			v[i]=vl[j];
		else
			v[i]=vr[j-st];
	}
	return l+st-1;
}
int main(){
	f=fopen("sdo.in","r");
	g=fopen("sdo.out","w");
	srand(time(0));
	fscanf(f,"%d%d",&n,&k);
	for(i=1;i<=n;i++){
		fscanf(f,"%d",&v[i]);
	}
	p=1;
	u=n;
	while(p<=u){
		mid=sdo(p,u);
		if(mid==k){
			fprintf(g,"%d",v[mid]);
			return 0;
		}
		if(mid<k)
			p=mid+1;
		else
			u=mid-1;
	}




	fclose(f);
	fclose(g);
	return 0;
}