Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#pragma optimization_level 3
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
- //#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
- #include <iostream>
- #include <algorithm>
- #include <fstream>
- #include <vector>
- #include <queue>
- #include <functional>
- #include <set>
- #include <map>
- #include <math.h>
- #include <cmath>
- #include <string>
- #include <random>
- #include <unordered_set>
- #include <unordered_map>
- #include <bitset>
- #include <string.h>
- #include <stack>
- #include <assert.h>
- #include <list>
- #include <time.h>
- #include <memory>
- #include <chrono>
- using namespace std;
- //
- #define fast cin.tie(0);cout.tie(0);cin.sync_with_stdio(0);cout.sync_with_stdio(0);
- #define cin in
- #define cout out
- #define ll long long
- #define db double
- #define ld long double
- #define uset unordered_set
- #define umap unordered_map
- #define ms multiset
- #define pb push_back
- #define pq priority_queue
- #define umap unordered_map
- #define uset unordered_set
- #define ull unsigned long long
- #define pii pair<int, int>
- #define pll pair<ll, ll>
- #define pdd pair<ld, ld>
- #define pnn pair<Node*, Node*>
- #define uid uniform_int_distribution
- #define PI acos(-1.0)
- //#define sort(a, b) sort(a.begin(), a.end(), b())
- //mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
- ifstream in("input.txt");
- ofstream out("output.txt");
- const int MAX_N = 1e5;
- ll sum[4*MAX_N];
- int mini[4*MAX_N];
- ll push[4*MAX_N]; // val in v is already recalced
- int n;
- void recalc(int v) {
- sum[v] = sum[2*v] + sum[2*v + 1];
- mini[v] = min(mini[2*v], mini[2*v+1]);
- }
- void make_push(int v, int lb, int rb) {
- if (push[v] == -1) return;
- int l = 2*v;
- int r = l + 1;
- int m = (lb + rb) / 2;
- mini[l] = mini[r] = push[v];
- sum[l] = (m - lb + 1) * push[v];
- sum[r] = (rb - m) * push[v];
- push[l] = push[r] = push[v];
- push[v] = -1;
- }
- ll get_sum(int v, int lb, int rb, int l, int r) {
- if (r < lb || l > rb)
- return 0;
- if (lb == l && rb == r)
- return sum[v];
- make_push(v, lb, rb);
- int m = (lb + rb) / 2;
- return get_sum(2*v, lb, m, l, min(m, r)) +
- get_sum(2*v+1, m+1, rb, max(m+1, l), r);
- }
- // left value <= x or -1
- int bin_s(int v, int lb, int rb, int x) {
- if (lb == rb) {
- if (mini[v] <= x) return lb;
- else return -1;
- }
- make_push(v, lb, rb);
- int m = (lb + rb) / 2;
- if (mini[2*v] <= x)
- return bin_s(2*v, lb, m, x);
- else
- return bin_s(2*v+1, m+1, rb, x);
- }
- int bin_s(int x) {
- return bin_s(0, 0, n-1, x);
- }
- void seg_assign(int v, int lb, int rb, int l, int r, ll x) {
- if (l > rb || r < lb) return;
- if (l == lb && r == rb) {
- push[v] = x;
- sum[v] = (rb - lb + 1) * x;
- mini[v] = x;
- return;
- }
- make_push(v, lb, rb);
- int m = (lb + rb) / 2;
- seg_assign(2*v, lb, m, l, min(m, r), x);
- seg_assign(2*v+1, m+1, rb, max(m+1, l), r, x);
- recalc(v);
- }
- void pref_max(int r, int x) {
- int l = bin_s(x);
- seg_assign(0, 0, n-1, l, r, x);
- }
- int main() {
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement