Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <random>
- using namespace std;
- unsigned long long N, M, x, y, sum, k;
- char c;
- unsigned long long pra[200000 + 100] = {0}, m[200000 * 4 + 200][2] = {0};
- void build(long int pr, long int pb, long int i)
- {
- if(pr == pb)
- {
- m[i][0] = pra[pr-1];
- }
- else
- {
- long int index = (pr + pb) / 2;
- build(pr, index, i * 2);
- build(index + 1, pb, i * 2 + 1);
- m[i][0] = m[i * 2][0] + m[i * 2 + 1][0];
- }
- }
- void suma(long int pr, long int pb, long int l, long int r, long int i)
- {
- if(m[i][1] != 0)
- {
- m[i][0] = m[i][1] * (pb - pr + 1);
- if(pr != pb)
- {
- m[i*2][1] = m[i][1];
- m[i*2+1][1] = m[i][1];
- }
- m[i][1] = 0;
- }
- if(pr >= l && pb <= r)
- {
- sum += m[i][0];
- }
- else if(pr != pb)
- {
- long int index = (pr + pb) / 2;
- if(pb >= l)
- suma(pr, index, l, r, i * 2);
- if(pr <= r)
- suma(index + 1, pb, l, r, i * 2 + 1);
- }
- }
- void add(long int pr, long int pb, long int l, long int r, long int kiek, long int i)
- {
- if(m[i][1] != 0)
- {
- m[i][0] = m[i][1] * (pb - pr + 1);
- if(pr != pb)
- {
- m[i*2][1] = m[i][1];
- m[i*2+1][1] = m[i][1];
- }
- m[i][1] = 0;
- }
- if(pr >= l && pb <= r)
- {
- m[i][1] = kiek;
- }
- else if(pr != pb)
- {
- long int index = (pr + pb) / 2;
- if(pb >= l)
- add(pr, index, l, r, kiek, i * 2);
- if(pr <= r)
- add(index + 1, pb, l, r, kiek, i * 2 + 1);
- }
- }
- unsigned long long arr[200010];
- void build2() {
- for (int i = 1; i <= N; i++) {
- arr[i] = pra[i - 1];
- }
- }
- void add2(int pr, int pb, long int kiek) {
- for (int i = pr; i <= pb; i++) {
- arr[i] = kiek;
- }
- }
- unsigned long long suma2(int pr, int pb) {
- unsigned long long s = 0;
- for (int i = pr; i <= pb; i++) {
- s += arr[i];
- }
- return s;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- cin.tie(0);
- srand(0);
- //cin >> N >> M;
- N = 2; M = 100000;
- cout << N << " " << M << endl;
- for(int a = 0; a < N; a++)
- {
- //cin >> pra[a];
- pra[a] = rand() % 10 + 1;
- cout << pra[a] << " ";
- }
- cout << endl;
- build(1, N, 1);
- build2();
- for(int a = 0; a < M; a++)
- {
- //cin >> c >> x >> y;
- c = "?!"[rand() % 2];
- x = rand() % N + 1;
- y = rand() % N + 1;
- if (x > y) swap(x, y);
- if(c == '?')
- {
- cout << "? " << x << " " << y << endl;
- sum = 0;
- suma(1, N, x, y, 1);
- unsigned long long expected = suma2(x, y);
- if (expected != sum) {
- cout << "expected: " << expected << endl;
- cout << "got: " << sum << endl;
- return 1;
- }
- // cout << sum << '\n';
- }
- else
- {
- k = rand() % 10 + 1;
- cout << "! " << x << " " << y << " " << k << endl;
- //cin >> k;
- add(1, N, x, y, k, 1);
- add2(x, y, k);
- }
- }
- cout << "All OK" << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment