Cod sursa(job #1829549)

Utilizator DobosDobos Paul Dobos Data 15 decembrie 2016 10:50:13
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <bits/stdc++.h>
#define NMAX 200005
#define INF 1e9
using namespace std;

ifstream fin("maxq.in");
ofstream fout("maxq.out");

struct smx{

int s,l,r,m;

};

smx V[4*NMAX];
int C[NMAX],Sol,S;

void buildtree(int nod,int L,int R){
    if(L == R){
        V[nod].l = V[nod].m = V[nod].s = V[nod].r = C[L];
        return;
    }

    int mid = (L + R)/2;

    buildtree(2 * nod,L,mid);
    buildtree(2 * nod + 1, mid + 1,R);

    V[nod].s = V[2 * nod].s + V[2 * nod + 1].s;
    V[nod].l = max(V[2 * nod].l,V[2 * nod].s + V[2 * nod + 1].l);
    V[nod].r = max(V[2 * nod + 1].r,V[2 * nod + 1].r + V[2 * nod].r);
    V[nod].m = max(max(V[2 * nod].m,V[2 * nod + 1].m), V[2 * nod].r + V[2 * nod + 1].l);

}

void update(int nod,int L,int R,int p,int val){

    if(L == R && L == p){
        V[nod].l = V[nod].m = V[nod].s = V[nod].r = val;
        return;
    }
    int mid = (L + R);
    if(p <= mid)
        update(2 * nod,L,mid,p,val);
    else
        update(2 * nod + 1,mid + 1,R,p,val);

    V[nod].s = V[2 * nod].s + V[2 * nod + 1].s;
    V[nod].l = max(V[2 * nod].l,V[2 * nod].s + V[2 * nod + 1].l);
    V[nod].r = max(V[2 * nod + 1].r,V[2 * nod + 1].r + V[2 * nod].r);
    V[nod].m = max(max(V[2 * nod].m,V[2 * nod + 1].m), V[2 * nod].r + V[2 * nod + 1].l);

}

void query(int nod,int L,int R,int m,int M){
    if(L >= m && R <= M){
        Sol = max(Sol,max(V[nod].m,S + V[nod].l));
        S = max(S + V[nod].s, V[nod].r);
        return;
    }
    int mid = (L + R)/2;
    if(m <= mid)
        query(2 * nod,L,mid,m,M);
    if(mid < M)
        query(2 * nod + 1,mid + 1,R,m,M);

}

int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);

    int n,m,q,x,y;

    fin >> n;

    for(int i = 1; i <= n; i++)
        fin >> C[i];

    buildtree(1,1,n);

    fin >> n;

    for(int i = 1; i <= m; i++){
        fin >> q >> x >> y;

        if(q == 0)
            update(1,1,n,x,y);
        else{
            Sol = INF;
            S = 0;
            query(1,1,n,x,y);
            fout << Sol << "\n";
        }

    }



    return 0;
}