Submission #297465

#TimeUsernameProblemLanguageResultExecution timeMemory
297465Ahmad_HasanFoehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
574 ms28140 KiB
#include <bits/stdc++.h>

using namespace std;

int n,m,ss,tt;
struct segmentTree{
    int sz=2;
    long long nl;
    vector<long long>s;
    vector<long long>t;
    vector<long long>operations,values;


    void updt(int i,long long vl){
        if(vl<=0){
            s[i]=vl*-1;
            t[i]=0;
        }else{
            s[i]=0;
            t[i]=vl;
        }
        for(i/=2;i>=1;i/=2){
            s[i]=s[i*2]+s[i*2+1];
            t[i]=t[i*2]+t[i*2+1];
        }
    }
    void build(vector<long long>v){
        for(int i=1;i<v.size();i++){
            updt(i+sz,v[i-1]-v[i]);
            values[i]=v[i];
        }
    }
    void init(int n,vector<long long>v){
        while(sz<n) sz*=2;
        operations=s=t=vector<long long>(2*sz,0);
        values=vector<long long>(2*sz,0);
        build(v);
        nl=n;
    }
    long long opera(long long x,long long y){
        if(y!=nl)
            return y;
        return x;
    }
    long long operation(long long &x,long long y){
        return x=opera(x,y);
    }


    void add(int l,int r,long long v,int x,int lx,int rx){
        if(rx<l||lx>r) return;
        if(lx>=l&&rx<=r){
            operations[x]+=v;
            if(rx+1>r&&rx+1<nl){
                ///cout<<get(rx)-get(rx+1)<<' '<<rx<<' '<<rx+1<<'\n';
                updt(rx+1+sz,get(rx)-get(rx+1));
            }

            if(lx-1<l){
                ///cout<<get(lx-1)-get(lx)<<' '<<lx-1<<' '<<lx<<'\n';
                updt(lx+sz,get(lx-1)-get(lx));
            }
            return;
        }
        int md=(lx+rx)/2;
        add(l,r,v,2*x,lx,md);
        add(l,r,v,2*x+1,md+1,rx);
    }

    void add(int l,int r,long long v){
        add(l,r,v,1,0,sz-1);
    }

    long long get(int i,int x,int lx,int rx){
        if(lx>=i&&(rx-lx+1)==1){
            return values[x-sz]+operations[x];
        }
        int md=(lx+rx)/2;
        long long res;
        if(i<=md){
            res=get(i,2*x,lx,md);
        }else{
            res=get(i,2*x+1,md+1,rx);
        }
        return res+operations[x];
    }
    long long get(int i){
        return get(i,1,0,sz-1);
    }
    long long answer(){
        return s[1]*ss*-1ll+t[1]*tt;
    }
     void print(){
        for(int i=1;i<=2*sz;i*=2){
            for(int j=i/2;j<i;j++){
                cout<<s[j]<<' ';
            }
            cout<<'\n';
        }
        for(int i=1;i<=2*sz;i*=2){
            for(int j=i/2;j<i;j++){
                cout<<t[j]<<' ';
            }
            cout<<'\n';
        }


     }
     void vals(){
        for(int i=0;i<nl;i++){
            cout<<get(i)<<' ';

        }
        cout<<'\n';
     }
};

int main()
{///{}
    ios_base::sync_with_stdio(0);
    cin.tie(0);      cout.tie(0);
    segmentTree st;
    cin>>n>>m>>ss>>tt;
    n++;
    vector<long long>v(n);
    for(int i=0;i<n;i++)
        cin>>v[i];
    st.init(n,v);

    ///st.print();
    ///st.vals();
    while(m--){

            long long l,r,v;
            cin>>l>>r>>v;
            st.add(l,r,v);
            cout<<st.answer()<<'\n';
    }
    ///st.print();
    ///st.vals();
    return 0;
}
/**
3 5 1 2
0
40000000000
10000000000
80000000000
1 2 20000000000
1 1 -20000000000
2 3 50000000000
1 2 -10000000000
1 3 50000000000

*/

Compilation message (stderr)

foehn_phenomena.cpp: In member function 'void segmentTree::build(std::vector<long long int>)':
foehn_phenomena.cpp:28:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   28 |         for(int i=1;i<v.size();i++){
      |                     ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...