Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* c652 */
- /* AC (0.2s, 18.4MB) */
- #pragma warning( disable : 4996 )
- #pragma GCC optimize("Ofast,unroll-loops,no-stack-protector,fast-math")
- #include <cstdio>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- using int16 = short;
- using uint16 = unsigned short;
- using uint = unsigned int;
- using int64 = long long;
- using uint64 = unsigned long long;
- /* main code */
- constexpr int MAXN = 300001;
- int N, Q, ql, qr;
- uint64 arr[MAXN], Sum[MAXN * 4], Max[MAXN * 4];
- uint64 initMax(int l, int r, int nowNode)
- {
- if (l == r)
- {
- Max[nowNode] = arr[l];
- return arr[l];
- }
- int mid = (l + r) >> 1;
- Max[nowNode] = max<uint64>(initMax(l, mid, nowNode << 1), initMax(mid + 1, r, nowNode << 1 | 1));
- return Max[nowNode];
- }
- uint64 initSum(int l, int r, int nowNode)
- {
- if (l == r)
- {
- Sum[nowNode] = arr[l];
- return arr[l];
- }
- int mid = (l + r) >> 1;
- Sum[nowNode] = initSum(l, mid, nowNode << 1) + initSum(mid + 1, r, nowNode << 1 | 1);
- return Sum[nowNode];
- }
- void updata_range(int l, int r, int nowNode)
- {
- if (Max[nowNode] <= 1) return;
- uint64 tmp;
- int mid;
- if (l == r)
- {
- tmp = arr[l] - (uint64)sqrt(arr[l]);
- Sum[nowNode >> 1] -= tmp;
- arr[l] -= tmp;
- Sum[nowNode] = Max[nowNode] = arr[l];
- return;
- }
- tmp = Sum[nowNode];
- mid = (l + r) >> 1;
- if (ql <= mid) updata_range(l, mid, nowNode << 1);
- if (qr >= mid + 1) updata_range(mid + 1, r, nowNode << 1 | 1);
- Max[nowNode] = max<uint64>(Max[nowNode << 1], Max[nowNode << 1 | 1]);
- Sum[nowNode >> 1] -= (tmp - Sum[nowNode]);
- }
- uint64 query_Sum(int l, int r, int nowNode)
- {
- if (ql <= l && qr >= r) return Sum[nowNode];
- int mid = (l + r) >> 1;
- uint64 res = 0;
- if (ql <= mid) res += query_Sum(l, mid, nowNode << 1);
- if (qr >= mid + 1) res += query_Sum(mid + 1, r, nowNode << 1 | 1);
- return res;
- }
- int main()
- {
- scanf("%d %d", &N, &Q);
- for (int i = 1; i <= N; ++i)
- scanf("%llu", arr + i);
- initMax(1, N, 1);
- initSum(1, N, 1);
- for (int i = 0, op; i < Q; ++i)
- {
- scanf("%d %d %d", &op, &ql, &qr);
- if (op == 0)
- printf("%llu\n", query_Sum(1, N, 1));
- else
- updata_range(1, N, 1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement