Cod sursa(job #2124232)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 7 februarie 2018 00:45:51
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <bits/stdc++.h>

using namespace std;

const int inf = 2000000000;
int n, m, v[100005], arb[4*1005], lazy[4*1005];

void build(int nod, int x, int y)
{
    if(x == y){
        arb[nod] = v[x];
    }else{
        int m = (x+y)/2;
        build(nod*2, x, m);
        build(nod*2+1, m+1, y);
        arb[nod] = max(arb[nod*2], arb[nod*2+1]);
    }
}

void update(int nod, int st, int dr, int i, int j, int val)
{
    if(lazy[nod] != 0){
        arb[nod] = lazy[nod];
        if(st != dr){
            lazy[nod*2] += lazy[nod];
            lazy[nod*2+1] += lazy[nod];
        }
        lazy[nod] = 0;
    }
    if(st >= i && dr <=j){
        arb[nod] = val;
        if(st != dr){
            lazy[nod*2] = val;
            lazy[nod*2+1] = val;
        }
        return;
    }
    int m = (st+dr)/2;
    if(m >= i)
        update(nod*2, st, m, i, j, val);
    if(m < j)
        update(nod*2+1, m+1, dr, i, j, val);
    arb[nod] = max(arb[nod*2], arb[nod*2+1]);
}

int query(int nod, int st, int dr, int i, int j)
{
    if(lazy[nod] != 0){
        arb[nod] = lazy[nod];
        if(st != dr){
            lazy[nod*2] += lazy[nod];
            lazy[nod*2+1] += lazy[nod];
        }
        lazy[nod] = 0;
    }
    if(st >= i && dr <= j)
        return arb[nod];
    int m = (st+dr)/2, ans = -inf;
    if(m >= i)
        ans = query(nod*2, st, m, i, j);
    if(m < j)
        ans = max(ans, query(nod*2+1, m+1, dr, i, j));
    return ans;
}

int main()
{
    ifstream fin ("arbint.in");
    ofstream fout ("arbint.out");
    cin >> n >> m;
    for (int i = 1; i <= n; ++i)
        cin >> v[i];
    build(1, 1, n);
    while(m--){
        int t, x, y, c;
        cin >> t;
        if(t == 0){
            cin >> x >> y;
            cout << query(1, 1, n, x, y) << "\n";
        }else{
            //cin >> x >> y >> c;
            cin >> x >> c;
            update(1, 1, n, x, x, c);
        }
    }
    return 0;
}