Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- struct Node{
- long long keymax, keymin, l, r, add;
- };
- vector <Node> tree(1e6);
- vector <long long> a(1e6);
- long long inf = 1e18;
- void build(long long ind, long long l, long long r){
- tree[ind].l = l;
- tree[ind].r = r;
- if (r - l == 1){
- tree[ind].add = 0;
- tree[ind].keymax = a[l];
- tree[ind].keymin = a[l];
- return;
- }
- long long m = (l + r) / 2;
- build(2 * ind, l, m);
- build(2 * ind + 1, m, r);
- tree[ind].keymax = max(tree[2 * ind].keymax, tree[2 * ind + 1].keymax);
- tree[ind].keymin = min(tree[2 * ind].keymin, tree[2 * ind + 1].keymin);
- }
- void modify(int ind, int x){
- tree[ind].keymax = x;
- tree[ind].keymin = x;
- tree[ind].add = x;
- }
- void push(long long ind){
- if (tree[ind].add == 0) return;
- else if (tree[ind].r - tree[ind].l > 1) {
- modify(2 * ind, tree[ind].add);
- modify(2 * ind + 1, tree[ind].add);
- tree[ind].add = 0;
- }
- }
- void update(long long ind, long long l, long long r, long long add){
- push(ind);
- if (l <= tree[ind].l && tree[ind].r <= r){
- modify(ind, add);
- return;
- }
- else if(l >= tree[ind].r || r <= tree[ind].l){
- return;
- }
- update(2 * ind, l, r, add);
- update(2 * ind + 1, l, r, add);
- tree[ind].keymax = max(tree[2 * ind].keymax, tree[2 * ind + 1].keymax);
- tree[ind].keymin = min(tree[2 * ind].keymin, tree[2 * ind + 1].keymin);
- }
- long long searchmax(long long ind, long long l, long long r){
- push(ind);
- if (l <= tree[ind].l && tree[ind].r <= r){
- return tree[ind].keymax;
- }
- else if(tree[ind].l >= r || tree[ind].r <= l){
- return -inf;
- }
- else{
- return max(searchmax(2 * ind, l, r), searchmax(2 * ind + 1, l, r));
- }
- }
- long long searchmin(long long ind, long long l, long long r){
- push(ind);
- if (l <= tree[ind].l && tree[ind].r <= r){
- return tree[ind].keymin;
- }
- else if(tree[ind].l >= r || tree[ind].r <= l){
- return inf;
- }
- else{
- return min(searchmin(2 * ind, l, r), searchmin(2 * ind + 1, l, r));
- }
- }
- int main() {
- long long n, m, q, l, r, c, b;
- cin >> n >> m >> q;
- char s;
- for (long long i = 1; i < n + 1; i++){
- cin >> a[i];
- }
- build(1, 1, n + 1);
- for (long long i = 0; i < q; i++){
- cin >> b >> c >> l >> r;
- if (searchmax(1, l, r + 1) == searchmin(1, l, r + 1) && searchmin(1, l, r + 1) == b) {
- update(1, l, r + 1, c);
- cout << 1 << '\n';
- } else {
- cout << 0 << '\n';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement