Cod sursa(job #2654297)

Utilizator alexsandulescuSandulescu Alexandru alexsandulescu Data 30 septembrie 2020 14:10:46
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.68 kb
#include <fstream>
#include <algorithm>
#include <random>
#include <ctime>


using namespace std;

ifstream f("secv8.in");
ofstream g("secv8.out");

int N, aux;


struct node {
	node *st, *dr;

	int val, priority, size;

	bool reversed;
} nil;

node* reverse(node *n) {

	n->reversed = !n->reversed;
	swap(n->st, n->dr);

	return n;
}

node* prop(node* n) {
	if (n->reversed && n != &nil) {
		n->reversed = false;

		n->st = reverse(n->st);
		n->dr = reverse(n->dr);

	}

	return n;
}

node *mod_fiu(node *n, int care, node* fiu) {
	if (care == 0) n->st = fiu;
	else n->dr = fiu;

	n->size = n->st->size + n->dr->size + 1;

	return n;
}

node *join(node *st, node *dr) {
	st = prop(st);
	dr = prop(dr);

	if (st == &nil) return dr;
	if (dr == &nil) return st;

	if (st->priority < dr->priority)
		return mod_fiu(dr, 0, join(st, dr->st));
	return mod_fiu(st, 1, join(st->dr, dr));
}

pair<node*, node*> split(node *n, int k) {
	n = prop(n);
	if (n == &nil) return { &nil, &nil };

	if (n->st->size >= k) {
		auto t = split(n->st, k);
		return { t.first, mod_fiu(n, 0, t.second) };
	}


	auto t = split(n->dr, k - n->st->size - 1);
	return { mod_fiu(n, 1, t.first), t.second };
}


node *insert(node *n, int poz, int val) {
	n = prop(n);
	pair <node*, node*> sp = split(n, poz);

	node *now = new node;
	*now = { &nil, &nil, val, rand(), 1, 0 };

	return join(join(sp.first, now), sp.second);
}

int get (node *n, int poz) {
    n = prop(n);
    auto t1 = split(n, poz + 1);
    auto t2 = split(t1.first, poz);
 
    n = join(join(t2.first, t2.second), t1.second);
 
    return t2.second->val;
}

node *reverseOP (node *n, int st, int dr) {
    n = prop(n);
    auto t1 = split(n, dr+1);
    auto t2 = split(t1.first, st);
 
    t2.second = reverse(t2.second);
 
    return join(join(t2.first, t2.second), t1.second);
}

node *remove (node *n, int st, int dr) {
    n = prop(n);
    auto t1 = split(n, dr + 1);
    auto t2 = split(t1.first, st);
 
    return join(t2.first, t1.second);
}
int main()
{
    srand(time(NULL));
	f >> N >> aux;

	node *rad = &nil;

	char ch;
	int st, dr, poz, val;


	for (int i = 0; i < N; i++) {
		f >> ch;

		if (ch == 'I') {
			f >> poz >> val;
			rad = insert(rad, poz - 1, val);
		} else if (ch == 'A') {
			f >> poz;
			g << get(rad, poz - 1) << "\n";
		} else if (ch == 'R') {
			f >> st >> dr;
            rad = reverseOP(rad, st - 1, dr - 1);
        } else if (ch == 'D') {
            f >> st >> dr;
            rad = remove(rad, st - 1, dr - 1);
        }
	}
	
	for (int i = 0; i < rad->size; i++) {
		g << get(rad, i) << " ";
	}
	g << "\n";
	return 0;
}