Cod sursa(job #3210614)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 6 martie 2024 20:59:54
Problema Secv8 Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.08 kb
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#include <ext/rope>
using __gnu_cxx::rope;

const int kLog = 10;
const int kBuf = 1 << 18;

FILE *fin, *fout;
const int p10[kLog + 1] = {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int rpos; char rbuf[kBuf];
int wpos; char wbuf[kBuf];

static inline int isspace(char ch) {
	return ch == ' ';
}

static inline void initRead() {
	rpos = kBuf - 1;
}

static inline char readChar() {
	if(!(rpos = (rpos + 1) & (kBuf - 1))) {
		fread(rbuf, 1, kBuf, fin);
	}
	return rbuf[rpos];
}

int readInt() {
	int ch, res = 0;
	while(isspace(ch = readChar()));
	do {
		res = 10 * res + ch - '0';
	} while(isdigit(ch = readChar()));
	return res;
}

static inline void initWrite() {
	wpos = 0;
}

static inline void writeChar( char ch ) {
	wbuf[wpos] = ch;
	if(!(wpos = (wpos + 1) & (kBuf - 1))) {
		fwrite(wbuf, 1, kBuf, fout);
	}
}

void writeInt(int x) {
	int i = kLog, d;
	while(p10[i] > x) {
		i--;
	}
	if(i == 0) {
		writeChar('0');
	} else {
		do {
			d = '0';
			while (p10[i] <= x) {
				x -= p10[i];
				d++;
			}
			writeChar(d);
		} while(--i > 0);
	}
}

static inline void flushBuf() {
	fwrite( wbuf, 1, wpos, fout );
}

int main() {
	fin = fopen("secv8.in", "r"); initRead();
	fout = fopen("secv8.out", "w"); initWrite();
	rope<int> s, mirror;
	int q = readInt();
	readInt();
	while(q--) {
		char task = readChar();
		if(task == 'I') {
			int k = readInt(), e = readInt();
			k--;
			mirror.insert(s.size() - k, e);
			s.insert(k, e);
		} else if(task == 'A') {
			int k = readInt();
			k--;
			writeInt(s[k]);
			writeChar('\n');
		} else if(task == 'R') {
			int l = readInt(), r = readInt();
			l--; r--;
			rope<int> subs = s.substr(l, r - l + 1);
			s.replace(l, r - l + 1, mirror.substr(s.size() - r - 1, r - l + 1));
			mirror.replace(s.size() - r - 1, r - l + 1, subs);
		} else {
			int l = readInt(), r = readInt();
			l--; r--;
			mirror.erase(s.size() - r - 1, r - l + 1);
			s.erase(l, r - l + 1);
		}
	}
	for(const auto &it: s) {
		writeInt(it);
		writeChar(' ');
	}
	flushBuf();
	fclose(fin);
	fclose(fout);
	return 0;
}