1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| int main() { int n,m; cin >> n >> m; int kn = pow(n,0.6666); vector<int> v(n + 1),K(n + 1); vector<array<int,4>> query = {{}}; vector<array<int,2>> modify = {{}}; for(int i=1;i<=n;++i) cin >> v[i],K[i] = (i-1)/kn + 1; for(int i=1;i<=m;++i) { string s;int x,y;cin >> s >> x >> y; if(s == "Q") query.emplace_back(x,y,(int)modify.size() - 1,(int)query.size()); else modify.emplace_back(x,y); } sort(query.begin() + 1,query.end(),[&](auto x,auto y){ if(K[x[0]] != K[y[0]]) return x[0] < y[0]; if(K[x[1]] != K[y[1]]) return x[1] < y[1]; return x[3] < y[3]; }); int l = 1,r = 0,val = 0,t = 0; for(int i=1;i<query.size(); ++ i) { auto &e = query[i]; int ql = e[0],qr = e[1],qt = e[2],id = e[3]; auto add = [&](int x) -> void {
}; auto sub = [&](int x) -> void {
}; auto time = [&](int x,int l,int r) -> void { int &w = modify[x][1], id = modify[x][0]; if(l <= id && id <= r) { sub(v[id]); add(w); } swap(v[id],w); }; while (l > ql) add(w[--l]); while (r < qr) add(w[++r]); while (l < ql) sub(w[l++]); while (r > qr) sub(w[r--]); while (t < qt) time(++t, ql, qr); while (t > qt) time(t--, ql, qr); ans[id] = val; } for(int i=1;i<=ans.size();++i) cout << ans[i] << endl; return 0; }
|