Submission #361197

#TimeUsernameProblemLanguageResultExecution timeMemory
361197HoneyBadgerFire (JOI20_ho_t5)C++17
20 / 100
232 ms23900 KiB
#include <iostream> #include <iomanip> #include <cstdio> #include <vector> #include <bitset> #include <string> #include <cstring> #include <map> #include <set> #include <stack> #include <queue> #include <deque> #include <utility> #include <algorithm> #include <random> #include <cmath> #include <cassert> #include <climits> #include <ctime> #include <chrono> /* #pragma GCC optimize("Ofast") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,tune=native") */ #ifdef LOCAL #define dbg(x) cout << #x << " : " << x << endl; #else #define dbg(x) #endif #define int long long #define pb push_back #define ppb pop_back() #define mp make_pair #define fi(a, b) for (int i = a; i < b; i++) #define fj(a, b) for (int j = a; j < b; j++) #define fk(a, b) for (int k = a; k < b; k++) #define fi1(a, b) for (int i = a - 1; i >= b; i--) #define fj1(a, b) for (int j = a - 1; j >= b; j--) #define fk1(a, b) for (int k = a - 1; k >= b; k--) #define fx(x, a) for (auto& x : a) #define rep(i, a, b) for (int i = a; i < b; ++i) #define rep1(i, a, b) for (int i = a - 1; i >= b; --i) #define siz(x) (int)x.size() #define lb lower_bound #define ub upper_bound #define all(x) x.begin(), x.end() using namespace std; template<typename T1, typename T2>inline void mine(T1 &x, const T2 &y) { if (y < x) x = y; } template<typename T1, typename T2>inline void maxe(T1 &x, const T2 &y) { if (x < y) x = y; } ostream& operator << (ostream &out, const vector<int> &b) { for (auto k : b) out << k << ' '; return out; } typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef char ch; typedef string str; typedef pair<int, int> pii; typedef vector<int> vi; typedef vector<vi> vvi; typedef vector<pii> vpii; typedef vector<vpii> vvpii; typedef vector<ch> vch; typedef vector<vch> vvch; typedef vector<str> vs; const int MOD = 1000000007; const int INF = 1000000050; const long long BIG = (long long)2e18 + 50; const int MX = 200010; const double EPS = 1e-9; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int s[MX]; int tree[4 * MX]; void build(int v, int l, int r) { if (l + 1 == r) { tree[v] = s[l]; return; } int m = (l + r) / 2; build(2 * v, l, m); build(2 * v + 1, m, r); tree[v] = max(tree[2 * v], tree[2 * v + 1]); } int get(int v, int l, int r, int cl, int cr) { if (cl >= r || cr <= l) return 0; if (cl >= l && cr <= r) return tree[v]; int m = (cl + cr) / 2; return max(get(2 * v, l, r, cl, m), get(2 * v + 1, l, r, m, cr)); } int BIT[MX]; void upd(int i) { for (++i; i < MX; i += i & -i) BIT[i]++; } int get(int i) { int res = 0; for (++i; i > 0; i -= i & -i) res += BIT[i]; return res; } int getlr(int l, int r) { return get(r) - get(l - 1); } int t[MX]; int l[MX]; int r[MX]; int ps[MX]; int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; bool all2 = true; for (int i = 0; i < n; ++i) { cin >> s[i]; all2 &= s[i] <= 2; } build(1, 0, n); bool allt = true; bool allone = true; for (int i = 0; i < q; ++i) { cin >> t[i] >> l[i] >> r[i]; --l[i]; allone &= r[i] - l[i] == 1; allt &= t[i] == t[0]; } if (max(n, q) <= 200) { for (int i = 0; i < q; ++i) { int ans = 0; for (int j = l[i]; j < r[i]; ++j) { ans += get(1, j - t[i], j + 1, 0, n); } cout << ans << '\n'; } } else if (allone) { for (int i = 0; i < q; ++i) { cout << get(1, l[i] - t[i], r[i], 0, n) << '\n'; } } else if (allt) { for (int i = 0; i < n; ++i) { s[i] = get(1, i - t[0], i + 1, 0, n); ps[i + 1] = ps[i] + s[i]; } for (int i = 0; i < q; ++i) { cout << ps[r[i]] - ps[l[i]] << '\n'; } } else if (all2) { vpii become; int pr = -INF; for (int i = 0; i < n; ++i) { if (s[i] == 2) { pr = i; } become.pb({i - pr, i}); } sort(all(become)); reverse(all(become)); vi reqs(q); fi(0, q) reqs[i] = i; sort(all(reqs), [&](int i, int j) { return t[i] < t[j]; }); vi ans(q); fx(id, reqs) { while (become.size() && become.back().first <= t[id]) { upd(become.back().second); become.ppb; } ans[id] = r[id] - l[id] + getlr(l[id], r[id] - 1); } for (int id = 0; id < q; ++id) cout << ans[id] << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...