Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <algorithm>
- #include <functional>
- #include <string>
- #include <queue>
- #include <time.h>
- #include <random>
- #include <cstring>
- #include <cmath>
- #include <bitset>
- #include <deque>
- #include <set>
- 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 pii pair<int,int>
- #define ll long long
- #define db double
- //ifstream in("sum.in");
- //ofstream out("sum.out");
- ifstream in("input.txt");
- ofstream out("output.txt");
- const int MAXN = 1e5, SIZE = 262144;
- ll tree[SIZE];
- int push[SIZE];
- void push_v(int v, int lb, int rb) {
- int cur = push[v];
- if (cur != 0) {
- push[v] = 0;
- int mid = (lb + rb) / 2;
- tree[2 * v] = (ll)(mid - lb + 1) * cur;
- tree[2 * v + 1] = (ll)(rb - mid) * cur;
- push[2 * v] = push[2 * v + 1] = cur;
- }
- }
- void upd(int v, int l, int r, int val, int lb, int rb) {
- if (lb > r || rb < l)
- return;
- if (l == lb && r == rb) {
- push[v] = val;
- tree[v] = (ll)(rb - lb + 1) * val;
- return;
- }
- push_v(v, lb, rb);
- int mid = (lb + rb) / 2;
- upd(2 * v, l, min(r, mid), val, lb, mid);
- upd(2 * v + 1, max(mid + 1, l), r, val, mid + 1, rb);
- tree[v] = tree[2 * v] + tree[2 * v + 1];
- }
- void upd(int l, int r, int val) {
- upd(1, l, r, val, 1, MAXN);
- }
- ll get_sum(int v, int l, int r, int lb, int rb) {
- if (lb > r || rb < l)
- return 0;
- if (lb == l && rb == r)
- return tree[v];
- push_v(v, lb, rb);
- int mid = (lb + rb) / 2;
- return get_sum(2 * v, l, min(mid, r), lb, mid) +
- get_sum(2 * v + 1, max(mid + 1, l), r, mid + 1, rb);
- }
- ll get_sum(int l, int r) {
- return get_sum(1, l, r, 1, MAXN);
- }
- void solve() {
- int n, k;
- cin >> n >> k;
- while (k--) {
- char c;
- cin >> c;
- if (c == 'A') {
- int l, r, x;
- cin >> l >> r >> x;
- upd(l, r, x);
- }
- else {
- int l, r;
- cin >> l >> r;
- cout << get_sum(l, r) << ' ';
- }
- }
- }
- int nums[30];
- void upd2(int l, int r, int val) {
- for (; l <= r; l++) {
- nums[l] = val;
- }
- }
- ll get_ans(int l, int r) {
- ll sum = 0;
- for (; l <= r; l++)
- sum += (ll)nums[l];
- return sum;
- }
- void gen() {
- int n = rand() % 10 + 1;
- int k = rand() % 10 + 1;
- for (int i = 0; i < k; i++) {
- int c = rand() % 2;
- if (c) {
- int l = rand() % n + 1;
- int r = (rand() % (n - l + 1)) + l;
- int val = rand() % 10;
- cout << "A " << l << ' ' << r << ' ' << val << '\n';
- upd(l, r, val);
- upd2(l, r, val);
- }
- else {
- int l = rand() % n + 1;
- int r = (rand() % (n - l + 1)) + l;
- cout << "Q " << l << ' ' << r << '\n';
- ll right = get_ans(l, r);
- ll my = get_sum(l, r);
- if (my != right) {
- cout << "\nmy = " << my << " right = " << right;
- exit(0);
- }
- }
- }
- }
- void clr() {
- memset(push, 0, sizeof(push));
- memset(tree, 0, sizeof(tree));
- memset(nums, 0, sizeof(nums));
- system("cls");
- }
- int main()
- {
- srand(time(0));
- int k = 100000;
- while (k--) {
- gen();
- clr();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment