Cod sursa(job #1060920)

Utilizator classiusCobuz Andrei classius Data 18 decembrie 2013 21:36:51
Problema SequenceQuery Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
using namespace std;

#include<ios>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<numeric>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<deque>

#define FILES

#ifdef FILES
#include<fstream>
ifstream cin("sequencequery.in");
ofstream cout("sequencequery.out");
#else
#include<iostream>
#endif

#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define ALL(a) a.begin(),a.end()
#define p_b(a) push_back(a)
#define m_p(a,b) make_pair(a,b)
#define p_p(a,b) p_b(m_p(a,b))

typedef unsigned char uchar;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vint;
typedef queue<int> qint;
typedef pair<int,int> pii;
typedef vector<pii> vpii;
typedef vector<string> vstr;
typedef queue<int> qint;
typedef deque<int> dqint;
typedef deque<ll> dqll;
typedef map<string,int> mpstri;
typedef map<int,int> mpinti;
typedef map<string,string> mpstrs;
typedef map<string,vstr> mpstrvs;
const int INFI=(1<<30);
const ll INFL=(1LL<<62);
const double eps=1e-7;
const long double pi=acos(-1.0);

const int MAXN=1000000;

int v[100000],sum[MAXN],left_max[MAXN],right_max[MAXN],tot_max[MAXN];

void update(int nod,int st,int dr,int i,int x){
    if(st==dr){
        sum[nod]+=x;
        left_max[nod]=right_max[nod]=tot_max[nod]=sum[nod];
        return;
    }
    int mid=(st+dr)/2;

    if(i<=mid) update(nod*2,st,mid,i,x);
    else update(nod*2+1,mid+1,dr,i,x);

    int lf=nod*2,rt=nod*2+1;
    sum[nod]=sum[lf]+sum[rt];
    left_max[nod]=max(left_max[lf],sum[lf]+left_max[rt]);
    right_max[nod]=max(right_max[rt],sum[rt]+right_max[lf]);
    tot_max[nod]=max3(tot_max[lf],tot_max[rt],right_max[lf]+left_max[rt]);
}

int s,mx;

void query(int nod,int st,int dr,int i,int j){
    if(i<=st && dr<=j){
        mx=max3(s+left_max[nod],mx,tot_max[nod]);
        s=max(s+sum[nod],right_max[nod]);
        mx=max(s,mx);
        return;
    }

    int mid=(st+dr)/2;

    if(i<=mid) query(nod*2,st,mid,i,j);
    if(j>mid) query(nod*2+1,mid+1,dr,i,j);
}

int main(){
    int n,m;

    cin>>n>>m;

    for(int i=1;i<=n;i++){
        cin>>v[i];
        update(1,1,n,i,v[i]);
    }

    for(int i=1;i<=m;i++){
        int cs=1,x,y;
        cin>>x>>y;
        if(!cs){
            int ax=y-v[x];
            update(1,1,n,x,ax);
            v[x]=ax;
        }else{
            s=0,mx=-INFI;
            query(1,1,n,x,y);
            cout<<mx<<'\n';
        }
    }

    return 0;
}