Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- const long long INF = 1e9;
- void build(vector<long long>& a, vector<long long>& z, int l, int r, int now) {
- if (l > r) {
- return;
- }
- if (l == r) {
- z[now] = a[l];
- return;
- }
- int mid = (l + r) / 2;
- build(a, z, l, mid, now * 2);
- build(a, z, mid + 1, r, now * 2 + 1);
- if (z[now * 2] == z[now * 2 + 1] && z[now * 2] != -1 && z[now * 2 + 1] != -1) {
- z[now] = z[now * 2];
- }
- else {
- z[now] = -1;
- }
- }
- void update(vector<long long>& z, int l, int r, int a, int b, int now, int value) {
- if (l > r || a > r || b < l) {
- return;
- }
- if (l == r) {
- z[now] = value;
- return;
- }
- int mid = (l + r) / 2;
- update(z, l, mid, a, b, now * 2, value);
- update(z, mid + 1, r, a, b, now * 2 + 1, value);
- if (z[now * 2] == z[now * 2 + 1] && z[now * 2] != -1 && z[now * 2 + 1] != -1) {
- z[now] = z[now * 2];
- }
- }
- int query(vector<long long>& z, int l, int r, int ind, int now) {
- if (l > r || !(l <= ind && ind <= r)) {
- return -INF;
- }
- if (z[now] != -1) {
- return z[now];
- }
- else {
- int mid = (l + r) / 2;
- if (l <= ind && ind <= mid) {
- return query(z, l, mid, ind, now * 2);
- }
- else {
- return query(z, mid + 1, r, ind, now * 2 + 1);
- }
- }
- }
- int main()
- {
- int n;
- cin >> n;
- vector<long long> a(n);
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- }
- vector<long long> z(n * 2, 0);
- build(a, z, 0, n - 1, 1);
- int m;
- cin >> m;
- for (int i = 0; i < m; ++i) {
- char c;
- cin >> c;
- if (c == 'g') {
- int ind;
- cin >> ind;
- ind--;
- cout << query(z, 0, n - 1, ind, 1) << " ";
- }
- else if (c == 'a') {
- int l, r, value;
- cin >> l >> r >> value;
- l--;
- r--;
- update(z, 0, n - 1, l, r, 1, value);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement