結果
問題 | No.2065 Sum of Min |
ユーザー |
![]() |
提出日時 | 2022-09-02 21:38:12 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 865 ms / 2,000 ms |
コード長 | 13,431 bytes |
コンパイル時間 | 2,794 ms |
コンパイル使用メモリ | 121,748 KB |
実行使用メモリ | 29,384 KB |
最終ジャッジ日時 | 2024-11-16 02:40:40 |
合計ジャッジ時間 | 17,659 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 20 |
ソースコード
#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <ctime>#include <cstdlib>#include <cassert>#include <vector>#include <list>#include <stack>#include <queue>#include <deque>#include <map>#include <set>#include <bitset>#include <string>#include <algorithm>#include <utility>#include <complex>#include <array>#include <unordered_set>#include <unordered_map>#define rep(x, s, t) for(ll x = (s); (x) <= (t); (x)++)#define per(x, s, t) for(ll x = (s); (x) >= (t); (x)--)#define reps(x, s) for(ll x = 0; (x) < (ll)(s).size(); (x)++)#define chmin(x, y) (x) = min((x), (y))#define chmax(x, y) (x) = max((x), (y))#define sz(x) ((ll)(x).size())#define all(x) (x).begin(),(x).end()#define rall(x) (x).rbegin(),(x).rend()#define outl(...) dump_func(__VA_ARGS__)#define outf(x) cout << fixed << setprecision(16) << (x) << endl#define pb push_back#define fi first#define se second#define inf 2e18#define eps 1e-9const double PI = 3.1415926535897932384626433;using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<ll, ll> P;struct edge{ll to, cost;edge(){}edge(ll a, ll b){ to = a, cost = b;}};const int dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1};const int mod = 1000000007;//const int mod = 998244353;struct mint{int x;mint(ll y = 0){if(y < 0 || y >= mod) y = (y%mod+mod)%mod; x = y;}mint(const mint &ope) {x = ope.x;}mint operator-(){return mint(-x);}mint operator+(const mint &ope){return mint(x) += ope;}mint operator-(const mint &ope){return mint(x) -= ope;}mint operator*(const mint &ope){return mint(x) *= ope;}mint operator/(const mint &ope){return mint(x) /= ope;}mint& operator+=(const mint &ope){x += ope.x; if(x >= mod) x -= mod; return *this;}mint& operator-=(const mint &ope){x += mod - ope.x; if(x >= mod) x -= mod; return *this;}mint& operator*=(const mint &ope){ll tmp = x; tmp *= ope.x, tmp %= mod; x = tmp; return *this;}mint& operator/=(const mint &ope){ll n = mod-2; mint mul = ope;while(n){if(n & 1) *this *= mul; mul *= mul; n >>= 1;}return *this;}mint inverse(){return mint(1) / *this;}bool operator ==(const mint &ope){return x == ope.x;}bool operator !=(const mint &ope){return x != ope.x;}bool operator <(const mint &ope)const{return x < ope.x;}};mint modpow(mint a, ll n){if(n == 0) return mint(1);if(n % 2) return a * modpow(a, n-1);else return modpow(a*a, n/2);}istream& operator >>(istream &is, mint &ope){ll t; is >> t, ope.x = t; return is;}ostream& operator <<(ostream &os, mint &ope){return os << ope.x;}ostream& operator <<(ostream &os, const mint &ope){return os << ope.x;}ll modpow(ll a, ll n, ll mod){if(n == 0) return 1;if(n % 2) return ((a%mod) * (modpow(a, n-1, mod)%mod)) % mod;else return modpow((a*a)%mod, n/2, mod) % mod;}vector<mint> fact, fact_inv;void make_fact(int n){fact.resize(n+1), fact_inv.resize(n+1);fact[0] = mint(1); rep(i, 1, n) fact[i] = fact[i-1] * mint(i);fact_inv[n] = fact[n].inverse(); per(i, n-1, 0) fact_inv[i] = fact_inv[i+1] * mint(i+1);}mint comb(int n, int k){ if(n < 0 || k < 0 || n < k) return mint(0); return fact[n] * fact_inv[k] * fact_inv[n-k];}mint perm(int n, int k){ return comb(n, k) * fact[k]; }template<typename T> T comb2(ll n, ll k){ T ret = 1; rep(i, 1, k) ret *= n-k+i, ret /= i; return ret;}vector<int> prime, pvec, qrime;void make_prime(int n){prime.resize(n+1);rep(i, 2, n){if(prime[i] == 0) pvec.push_back(i), prime[i] = i;for(auto p : pvec){ if(i*p > n || p > prime[i]) break; prime[i*p] = p;}}}void make_qrime(int n){qrime.resize(n+1);rep(i, 2, n){int ni = i / prime[i]; if(prime[i] == prime[ni]) qrime[i] = qrime[ni] * prime[i]; else qrime[i] = prime[i];}}bool exceed(ll x, ll y, ll m){return y > 0 && x >= m / y + 1;}void mark(){ cout << "*" << endl; }void yes(){ cout << "YES" << endl; }void no(){ cout << "NO" << endl; }ll floor(ll a, ll b){ if(b < 0) a *= -1, b *= -1; if(a >= 0) return a/b; else return -((-a+b-1)/b); }ll ceil(ll a, ll b){ if(b < 0) a *= -1, b *= -1; if(a >= 0) return (a+b-1)/b; else return -((-a)/b); }ll modulo(ll a, ll b){ b = abs(b); return a - floor(a, b) * b;}ll sgn(ll x){ if(x > 0) return 1; if(x < 0) return -1; return 0;}ll gcd(ll a, ll b){if(b == 0) return a; return gcd(b, a%b);}ll lcm(ll a, ll b){return a/gcd(a, b)*b;}ll arith(ll x){return x*(x+1)/2;}ll arith(ll l, ll r){return arith(r) - arith(l-1);}ll digitnum(ll x, ll b = 10){ll ret = 0; for(; x; x /= b) ret++; return ret;}ll digitsum(ll x, ll b = 10){ll ret = 0; for(; x; x /= b) ret += x % b; return ret;}string lltos(ll x, ll b = 10){string ret; for(;x;x/=b) ret += x % b + '0'; reverse(all(ret)); return ret;}ll stoll(string &s, ll b = 10){ll ret = 0; for(auto c : s) ret *= b, ret += c - '0'; return ret;}template<typename T> void uniq(T &vec){sort(all(vec)); vec.erase(unique(all(vec)), vec.end());}int popcount(ull x){x -= ((x>>1)&0x5555555555555555ULL), x = (x & 0x3333333333333333ULL) + ((x>>2) & 0x3333333333333333ULL);return (((x + (x>>4)) & 0x0F0F0F0F0F0F0F0FULL) * 0x0101010101010101ULL) >> 56;}template<class S, class T> pair<S, T>& operator+=(pair<S, T> &s, const pair<S, T> &t){s.first += t.first, s.second += t.second; return s;}template<class S, class T> pair<S, T>& operator-=(pair<S, T> &s, const pair<S, T> &t){s.first -= t.first, s.second -= t.second; return s;}template<class S, class T> pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t){return pair<S,T>(s.first+t.first, s.second+t.second);}template<class S, class T> pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t){return pair<S,T>(s.first-t.first, s.second-t.second);}template<class T> T dot(const pair<T, T> &s, const pair<T, T> &t){return s.first*t.first + s.second*t.second;}template<class T> T cross(const pair<T, T> &s, const pair<T, T> &t){return s.first*t.second - s.second*t.first;}template<class T> T mdist(pair<T, T> s, pair<T, T> t){return abs(s.first-t.first) + abs(s.second-t.second);}template<class T> T edist2(pair<T, T> s, pair<T, T> t){return (s.first-t.first)*(s.first-t.first) + (s.second-t.second)*(s.second-t.second);}template<typename T> ostream& operator << (ostream& os, vector<T>& vec){reps(i, vec) os << vec[i] << " "; return os;}template<typename T> ostream& operator << (ostream& os, const vector<T>& vec){reps(i, vec) os << vec[i] << " "; return os;}template<typename T> ostream& operator << (ostream& os, list<T>& ls){for(auto x : ls) os << x << " "; return os;}template<typename T> ostream& operator << (ostream& os, const list<T>& ls){for(auto x : ls) os << x << " "; return os;}template<typename T> ostream& operator << (ostream& os, deque<T>& deq){reps(i, deq) os << deq[i] << " "; return os;}template<typename T, typename U> ostream& operator << (ostream& os, pair<T, U>& ope){ os << "(" << ope.first << ", " << ope.second << ")"; return os;}template<typename T, typename U> ostream& operator << (ostream& os, const pair<T, U>& ope){ os << "(" << ope.first << ", " << ope.second << ")";return os;}template<typename T, typename U> ostream& operator << (ostream& os, map<T, U>& ope){ for(auto p : ope) os << "(" << p.first << ", " << p.second << "),";return os;}template<typename T> ostream& operator << (ostream& os, set<T>& ope){for(auto x : ope) os << x << " "; return os;}template<typename T> ostream& operator << (ostream& os, multiset<T>& ope){for(auto x : ope) os << x << " "; return os;}template<typename T> void outa(T a[], ll s, ll t){rep(i, s, t){ cout << a[i]; if(i < t) cout << " ";} cout << endl;}template<typename T, size_t N> ostream& operator << (ostream& os, array<T, N>& arr){reps(i, arr) os << arr[i] << " "; return os;}template<typename T, size_t N> ostream& operator << (ostream& os, const array<T, N>& arr){reps(i, arr) os << arr[i] << " "; return os;}void dump_func(){cout << endl;}template <class Head, class... Tail>void dump_func(Head &&head, Tail &&... tail){cout << head; if(sizeof...(Tail) > 0) cout << " "; dump_func(std::move(tail)...);}struct SegTreeBeats{typedef pair<P, ll> OPE;int size;vector<ll> sum;vector<ll> Max1, Max2, Mnum;vector<ll> min1, min2, mnum;vector<OPE> delay;SegTreeBeats(){}SegTreeBeats(int size){this->size = size;sum.resize(1<<(size+1)), delay.resize(1<<(size+1));Max1.resize(1<<(size+1)), Max2.resize(1<<(size+1)), Mnum.resize(1<<(size+1));min1.resize(1<<(size+1)), min2.resize(1<<(size+1)), mnum.resize(1<<(size+1));}void init(){for(int i = 0; i < (1<<(size+1)); i++){sum[i] = 0, delay[i] = OPE(P(-inf, inf), 0);Max1[i] = 0, Max2[i] = -inf, Mnum[i] = 1;min1[i] = 0, min2[i] = inf, mnum[i] = 1;}}void calc(int k){int l = k*2, r = k*2+1;if(Max1[l] > Max1[r]){Max1[k] = Max1[l], Max2[k] = max(Max2[l], Max1[r]);Mnum[k] = Mnum[l];}else if(Max1[l] < Max1[r]){Max1[k] = Max1[r], Max2[k] = max(Max1[l], Max2[r]);Mnum[k] = Mnum[r];}else{Max1[k] = Max1[l], Max2[k] = max(Max2[l], Max2[r]);Mnum[k] = Mnum[l] + Mnum[r];}if(min1[l] < min1[r]){min1[k] = min1[l], min2[k] = min(min2[l], min1[r]);mnum[k] = mnum[l];}else if(min1[l] > min1[r]){min1[k] = min1[r], min2[k] = min(min1[l], min2[r]);mnum[k] = mnum[r];}else{min1[k] = min1[l], min2[k] = min(min2[l], min2[r]);mnum[k] = mnum[l] + mnum[r];}sum[k] = sum[l] + sum[r];}OPE merge(OPE p, OPE q){ll a = p.second, b = q.second;ll l = p.first.first, u = p.first.second, L = q.first.first-a, U = q.first.second-a;chmax(l, L), chmax(u, L);chmin(l, U), chmin(u, U);return OPE(P(l, u), a+b);}void eval(int l, int r, int k){if(delay[k] != OPE(P(-inf, inf), 0)){ll lb = delay[k].first.first, ub = delay[k].first.second, add = delay[k].second;sum[k] -= max(0LL, Max1[k] - ub) * Mnum[k];sum[k] += max(0LL, lb - min1[k]) * mnum[k];sum[k] += add * (r-l+1);chmin(Max1[k], ub), chmin(min1[k], ub), chmin(min2[k], ub);chmax(min1[k], lb), chmax(Max1[k], lb), chmax(Max2[k], lb);Max1[k] += add, Max2[k] += add;min1[k] += add, min2[k] += add;if(Max1[k] == min1[k]){Max2[k] = -inf, min2[k] = inf;Mnum[k] = mnum[k] = r-l+1;}if(l < r){delay[k*2] = merge(delay[k*2], delay[k]);delay[k*2+1] = merge(delay[k*2+1], delay[k]);}delay[k] = OPE(P(-inf, inf), 0);}}void update(int i, ll val){int l = 0, r = (1<<size)-1, k = 1;eval(l, r, k);for(int j = size-1; j >= 0; j--){k <<= 1;if(i & (1<<j)){k++;l = (l+r)/2+1;}else r = (l+r)/2;eval(l, r, k);}int p = i + (1<<size);sum[p] = val;Max1[p] = val, Max2[p] = -inf, Mnum[p] = 1;min1[p] = val, min2[p] = inf, mnum[p] = 1;l = i, r = i, k = i+(1<<size);for(int j = 0; j < size; j++){k /= 2, l &= ~(1<<j), r |= 1<<j;eval(l, (l+r)/2, k*2), eval((l+r)/2+1, r, k*2+1);calc(k);}}void chooseMin(int a, int b, int k, int l, int r, ll x){eval(l, r, k);if(b < l || r < a || x > Max1[k]) return;if(a <= l && r <= b && Max2[k] < x && x <= Max1[k]){delay[k] = merge(delay[k], OPE(P(-inf, x), 0));eval(l, r, k);return;}chooseMin(a, b, k*2, l, (l+r)/2, x);chooseMin(a, b, k*2+1, (l+r)/2+1, r, x);calc(k);}void chooseMin(int a, int b, ll x){if(a > b) return;chooseMin(a, b, 1, 0, (1<<size)-1, x);}void chooseMax(int a, int b, int k, int l, int r, ll x){eval(l, r, k);if(b < l || r < a || x < min1[k]) return;if(a <= l && r <= b && min2[k] > x && x >= min1[k]){delay[k] = merge(delay[k], OPE(P(x, inf), 0));eval(l, r, k);return;}chooseMax(a, b, k*2, l, (l+r)/2, x);chooseMax(a, b, k*2+1, (l+r)/2+1, r, x);calc(k);}void chooseMax(int a, int b, ll x){if(a > b) return;chooseMax(a, b, 1, 0, (1<<size)-1, x);}void add(int a, int b, int k, int l, int r, ll x){eval(l, r, k);if(b < l || r < a) return;if(a <= l && r <= b){delay[k] = merge(delay[k], OPE(P(-inf, inf), x));eval(l, r, k);return;}add(a, b, k*2, l, (l+r)/2, x);add(a, b, k*2+1, (l+r)/2+1, r, x);calc(k);}void add(int a, int b, ll x){if(a > b) return;add(a, b, 1, 0, (1<<size)-1, x);}ll querySum(int a, int b, int k, int l, int r){eval(l, r, k);if(b < l || r < a) return 0;if(a <= l && r <= b) return sum[k];ll lval = querySum(a, b, k*2, l, (l+r)/2);ll rval = querySum(a, b, k*2+1, (l+r)/2+1, r);return lval + rval;}ll querySum(int a, int b){if(a > b) return 0;return querySum(a, b, 1, 0, (1<<size)-1);}ll queryMax(int a, int b, int k, int l, int r){eval(l, r, k);if(b < l || r < a) return -inf;if(a <= l && r <= b) return Max1[k];ll lval = queryMax(a, b, k*2, l, (l+r)/2);ll rval = queryMax(a, b, k*2+1, (l+r)/2+1, r);return max(lval, rval);}ll queryMax(int a, int b){if(a > b) return -inf;return queryMax(a, b, 1, 0, (1<<size)-1);}};ll n, Q;ll a[100005];ll l[100005], r[100005], x[100005];ll ans[100005];vector<P> vec;int main(void){ios::sync_with_stdio(0);cin.tie(0);cin >> n >> Q;rep(i, 1, n) cin >> a[i];rep(i, 1, Q) cin >> l[i] >> r[i] >> x[i];rep(i, 1, Q) vec.pb(P(x[i], i));sort(rall(vec));SegTreeBeats seg(17);rep(i, 1, n) seg.update(i, a[i]);for(auto p : vec){ll id = p.se;seg.chooseMin(1, n, p.fi);ans[id] = seg.querySum(l[id], r[id]);}rep(i, 1, Q) cout << ans[i] << "\n";return 0;}