Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- .----------------. .-----------------. .----------------. .----------------. .----------------.
- | .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
- | | __ | || | ____ _____ | || | _____ | || | _______ | || | ____ ____ | |
- | | / \ | || ||_ \|_ _| | || | |_ _| | || | / ___ | | || | |_ || _| | |
- | | / /\ \ | || | | \ | | | || | | | | || | | (__ \_| | || | | |__| | | |
- | | / ____ \ | || | | |\ \| | | || | | | | || | '.___`-. | || | | __ | | |
- | | _/ / \ \_ | || | _| |_\ |_ | || | _| |_ | || | |`\____) | | || | _| | | |_ | |
- | ||____| |____|| || ||_____|\____| | || | |_____| | || | |_______.' | || | |____||____| | |
- | | | || | | || | | || | | || | | |
- | '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
- '----------------' '----------------' '----------------' '----------------' '----------------'
- */
- #include <bits/stdc++.h>
- #include <algorithm>
- #define lli long long int
- #define li long int
- #define ll long long
- #define vi vector<lli>
- #define umii unordered_map<lli, lli>
- #define usi unordered_set<lli>
- #define usc unordered_set<char>
- #define umci unordered_map<char, lli>
- #define vii vector<pair<lli, lli>>
- #define pii pair<lli, lli>
- #define w(t) \
- lli t; \
- cin >> t; \
- while (t--)
- #define mod 1000000007
- #define ld long double
- #define all(x) x.begin(), x.end()
- #define F first
- #define S second
- #define PB push_back
- #define MP make_pair
- #define REP(i, a, b) for (lli i = a; i < b; i++)
- using namespace std;
- lli n, q;
- vi seg;
- void updateSegment(lli idx, lli low, lli high, lli l, lli r)
- {
- if (low == high)
- {
- // Leaf Node
- seg[idx]++;
- return;
- }
- if (low >= l && high <= r)
- {
- // Complete Overlap
- seg[idx]++;
- return;
- }
- // lli mid = low + (high - low) / 2;
- lli mid = (high + low) / 2;
- if (l <= mid)
- {
- updateSegment(2 * idx + 1, low, mid, l, r);
- }
- if (mid < r)
- {
- updateSegment(2 * idx + 2, mid + 1, high, l, r);
- }
- }
- void performLazyUpdates(lli idx, lli low, lli high, lli x, lli time, vi &nums)
- {
- time += seg[idx];
- if (low == high)
- {
- lli val = nums[x];
- while (time--)
- {
- if (val < 10)
- break;
- lli upval = 0;
- while (val != 0)
- {
- upval += val % 10;
- val = val / 10;
- }
- val = upval;
- }
- cout << val << endl;
- return;
- }
- // lli mid = low + (high - low) / 2;
- lli mid = (high + low) / 2;
- if (mid >= x)
- {
- performLazyUpdates(2 * idx + 1, low, mid, x, time, nums);
- }
- else
- {
- performLazyUpdates(2 * idx + 2, mid + 1, high, x, time, nums);
- }
- }
- void solve()
- {
- cin >> n >> q;
- seg.resize(4 * n, 0);
- vi nums(n);
- REP(i, 0, n)
- cin >> nums[i];
- while (q--)
- {
- lli type;
- cin >> type;
- if (type == 1)
- {
- lli l, r;
- cin >> l >> r;
- l--;
- r--;
- updateSegment(0, 0, n - 1, l, r);
- }
- else
- {
- lli x;
- cin >> x;
- x--;
- performLazyUpdates(0, 0, n - 1, x, 0, nums);
- }
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- w(t)
- {
- solve();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment