这么sb的题本来想练练手记过就是过不了
拍半天也没问题
留坑
哪天有空了去linux下面试试
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream> using namespace std;
template<typename Q> bool read(Q& x) {
static char c, f;
for(f = ; c = getchar(), !isdigit(c); ) if(c == '-') f = ;
for(x = ; isdigit(c); c = getchar()) x = x * + c - '';
if(f) x = -x; return c != ')';
}
template<typename Q> Q read() {
static Q x; read(x); return x;
} const int N = + ; int a[N], n; struct SegmentTree {
int da[N * ]; #define mid ((l + r) >> 1)
#define ls s << 1, l, mid
#define rs s << 1 | 1, mid + 1, r void build(int s, int l, int r) {
if(l == r) return da[s] = a[l], void();
build(ls), build(rs);
da[s] = min(da[s << ], da[s << | ]);
} int lft, rgt, w; int query(int s, int l, int r) {
if(lft <= l && r <= rgt) return da[s];
if(rgt <= mid) return query(ls);
if(mid < lft) return query(rs);
return min(query(ls), query(rs));
} void modify(int s, int l, int r) {
if(l == lft) return da[s] = w, void();
if(lft <= mid) modify(ls); else modify(rs);
da[s] = min(da[s << ], da[s << | ]);
} int Q(int l, int r) {
return lft = l, rgt = r, query(, , n);
} void M(int p, int w) {
lft = p, this->w = w;
modify(, , n);
}
}seg; int b[N], tot; char enter[]; int main() {
#ifdef DEBUG
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif int m, l, r, x;
read(n), read(m);
for(int i = ; i <= n; i++) {
read(a[i]);
}
seg.build(, , n);
// gets(enter);
char opt[]; for(int i = ; i <= m; i++) {
// fprintf(stderr, "%d\n", i);
scanf("%[^(]", opt);
if(opt[] == 'q') {
read(l), read(r);
printf("%d\n", seg.Q(l, r));
}else {
tot = ;
while() {
int t = read(x);
b[tot++] = x;
if(!t) break;
}
if(tot == ) continue;
reverse(b, b + tot);
int last = a[b[tot - ]];
for(int i = ; i < tot; i++) {
seg.M(b[i], last);
swap(a[b[i]], last);
}
}
gets(enter);
} return ;
}