Cod sursa(job #2503007)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 2 decembrie 2019 08:53:20
Problema Schi Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n;
struct lis{
	lis *fo, *ba;
	int v;
	lis(int v) : v(v){
		fo = ba = this;
	}
};
lis *fi;
lis *pu;
int pup;

int choisir(int a, int b, int c){
    if(a < b && a < c){
        return 1;
    }else if(b < a && b < c){
        return 2;
    }else{
        return 3;
    }
}

int mabs(int a){
    if(a < 0){
        a = -a;
    }
    return a;
}

void ard(int p, int v){
    lis *nu = new lis(v);
	if(v == 1){
		fi = nu;
	}else{
		lis *cu = fi;
		int c = choisir(p-1, v-p, mabs(pup-p));

		int st;
		if(c == 1 || c == 2){
            cu = fi;
            if(c == 1){
                st = 1;
            }else{
                st = v;
            }
		}else{
            cu = pu;
            st = pup;
		}
		if(p - st > 0){
			for(int i = st; i < p; i++){
				cu = cu->fo;
			}
		}else{
			for(int i = st; i > p; i--){
				cu = cu->ba;
			}
		}
		nu->fo = cu;
		nu->ba = cu->ba;

		nu->fo->ba = nu;
		nu->ba->fo = nu;

		if(p == 1){
			fi = nu;
		}
	}
	pu = nu;
	pup = p;
}

void tez(int a){
	lis *cu = fi;
	for(int i = 1; i <= a; i++){
		cout << cu->v << " ";
		cu = cu->fo;
	}
	cout << "\n";
}

int main(){
	fin >> n;
	for(int i = 1; i <= n; ++i){
		int p;
		fin >> p;
		ard(p, i);
	}

	lis *cu = fi;
	for(int i = 1; i <= n; i++){
		fout << cu->v << "\n";
		cu = cu->fo;
	}
	return 0;
}