Cod sursa(job #1797201)

Utilizator mihai.alphamihai craciun mihai.alpha Data 4 noiembrie 2016 09:04:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.6 kb
#include <bits/stdc++.h>
#define MAX 1000000
///COMPLETE SEGMENT TREE WITH BONUS LAZY UPDATE
int v[MAX], tree[MAX], lazy[MAX];
void build_tree(int node, int a, int b)  {
    if(a > b)
        return;
    if(a == b)  {
        tree[node] = v[a];
        return;
    }
    build_tree(node * 2, a, (a + b) / 2);
    build_tree(node *2 + 1, (a + b) / 2 + 1, b);
    tree[node] = std::max(tree[node * 2], tree[node * 2 + 1]);
}
void update_tree(int node, int a, int b, int i, int j, int value)  {
    if(lazy[node])  {
        tree[node] += lazy[node];
        if(a != b)  {
            lazy[node * 2] += tree[node];
            lazy[node * 2 + 1] += tree[node];
        }
        lazy[node] = 0;
    }
    if(a > b || a > j || b < i)
        return;
    if(a >= i && b <= j)  {
     //   tree[node] += value;
     tree[node] += value;
    if(a != b)  {
        lazy[node * 2] += value;
        lazy[node * 2 + 1] += value;
    }
    return;
    }
    update_tree(node *2, a, (a + b) / 2, i, j, value);
    update_tree(node * 2 + 1, (a + b) / 2 + 1, b, i, j, value);

    tree[node] = std::max(tree[node * 2], tree[node * 2 + 1]);
}
int query_tree(int node, int a, int b, int i, int j)  {
    if(a > b || a > j || b < i)return INT_MIN;
    if(lazy[node] != 0)  {
        tree[node] += lazy[node];
        if(a != b)  {
            lazy[node * 2] += lazy[node];
            lazy[node * 2 + 1] += lazy[node];
        }
        lazy[node] = 0;
    }
    if(a >= i && b <= j)
        return tree[node];
    int q1 = query_tree(node * 2 + 1, (a + b) / 2 + 1, b, i, j);
    int q2 = query_tree(node * 2, a, (a + b) / 2, i, j);
    int res = std::max(q1, q2);
    return res;
}

FILE *fin, *fout;
int main()  {
    fin = fopen("arbint.in", "r");
    fout = fopen("arbint.out", "w");
    int n, m;
    fscanf(fin, "%d%d", &n, &m);
    int i, cer, a, b;
    for(i = 0;i < n;i++)
        fscanf(fin, "%d", &v[i]);
    build_tree(1, 0, n - 1);
    memset(lazy, 0, sizeof(lazy));
    for(i = 0;i < m;i++)  {
        fscanf(fin, "%d%d%d", &cer, &a, &b);
//        for(int j = 0;j < n;j++)
//                printf("%d ", v[j]);
//            printf("\n");

    //    printf("%d ", cer);
        if(cer == 1)  {
            a--;
            int quer;
            quer = query_tree(1, 0, n - 1, a, a);
            update_tree(1, 0, n - 1, a, a, b - quer);
        }
        else  {
            b--;
            a--;
            int q;
            q = query_tree(1, 0, n - 1, a, b);
            fprintf(fout, "%d\n", q);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}