Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define E(A,B) for (int A = 0; A < B; A++)
- #define R(F,V,C) V = F(V,C);
- #define dout if ( 0 ) cout
- typedef long long int i64;
- const int L = 0;
- const int R = 1;
- const int V = 2;
- int n, q;
- set<tuple<int, int, double>> ss;
- bool split(int x) {
- if (x > n) return false;
- auto seg = ss.lower_bound(make_tuple(x, INT_MAX, INT_MAX)); seg--;
- int l = get<L>(*seg);
- int r = get<R>(*seg);
- double v = get<V>(*seg);
- double e = v / (r-l);
- if (l == x) return false;
- ss.erase(seg);
- ss.insert(make_tuple(l, x, e*(x-l)));
- ss.insert(make_tuple(x, r, e*(r-x)));
- return true;
- }
- void unite(int l, int r) {
- split(l);
- split(r);
- auto seg = ss.lower_bound(make_tuple(l, INT_MAX, INT_MAX)); seg--;
- double nv = 0;
- bool running = true;
- while (running && seg != ss.end()) {
- int segl = get<L>(*seg);
- int segr = get<R>(*seg);
- double segv = get<V>(*seg);
- if (segr == r) running = false;
- nv += segv;
- auto segz = seg;
- seg++;
- ss.erase(segz);
- }
- ss.insert(make_tuple(l, r, nv));
- }
- double query(int x) {
- auto seg = ss.lower_bound(make_tuple(x, INT_MAX, INT_MAX)); seg--;
- int l = get<L>(*seg);
- int r = get<R>(*seg);
- double v = get<V>(*seg);
- return v / (r-l);
- }
- void solve() {
- cin >> n >> q;
- E(i,n) {
- int v;
- cin >> v;
- ss.insert(make_tuple(i+1, i+2, v));
- }
- E(_,q) {
- int l, r, x;
- string t;
- cin >> t;
- if (t == "get") {
- cin >> x;
- cout << query(x) << "\n";
- } else {
- cin >> l >> r;
- unite(l, r+1);
- }
- }
- }
- /**
- 3 8
- 1 2 3
- get 1
- get 3
- shuffle 1 2
- shuffle 2 3
- get 1
- get 3
- shuffle 1 3
- get 2
- */
- int main() {
- string problem_name = "xxx";
- // freopen((problem_name + ".in").c_str(), "r", stdin); freopen((problem_name + ".out").c_str(), "w", stdout);
- cout << setprecision(20) << fixed;
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- solve();
- }
Advertisement
Add Comment
Please, Sign In to add comment