#include <iostream>
#include <iomanip>
#include <cstdint>
#include <algorithm>
#include <string>
#include <cassert>
#include "vector.h"

void Info(const MyVector &vector) {
    std::cout << vector.Sum() << ' ' 
              << std::setprecision(4) << std::fixed
              << vector.Mean() << ' '
              << vector.Min() << ' '
              << vector.Max() << '\n';
}

void CopyReverse(MyVector v) {
    std::reverse(v.Begin(), v.End());
    std::cout << v << '\n';
}

void CheckSlice(MyVector v) {
    (*v(0, 0).Begin()) = 6;
    assert(v[0] == 6);
}

int main() {
    int n, m;
    std::cin >> n >> m;
    MyVector vec(n);
    std::cin >> vec;
    static_assert(sizeof(vec(0, 0)) <= 16);
    CopyReverse(vec);

    int x = vec[0];
    CheckSlice(vec);
    assert(v[0] == x);


    std::string cmd;
    while (m--) {
        std::cin >> cmd;
        if (cmd == "add") {
            size_t index;
            int32_t x;
            std::cin >> index >> x;
            if (index != 0) { 
                vec.Insert(x, vec.Begin() + index - 1);
            } else {
                vec.PushBack(x);
            }
        } else if (cmd == "remove") {
            size_t index;
            std::cin >> index;
            if (index != 0) {
                vec.Erase(vec.Begin() + index - 1);
            } else {
                vec.PopBack();
            }
        } else if (cmd == "get") {
            ssize_t index; std::cin >> index;
            std::cout << vec[index] << '\n';
        } else if (cmd == "subget") {
            ssize_t l, r; std::cin >> l, r;
            std::cout << vec(l, r) << '\n';
        } else if (cmd == "concat") {
            size_t m; std::cin >> m;
            MyVector other(m);
            std::cin >> other;
            vec ^= other;
        } else if (cmd == "info") {
            Info(vec);
        }
#ifdef DEBUG
        std::cout << vec << '\n';
#endif
    }
    std::cout << vec << '\n';
}