제출 #398450

#제출 시각아이디문제언어결과실행 시간메모리
398450lukameladzeFoehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
519 ms16284 KiB
# include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
using namespace std;
const int N=3e5+5;
long long n,m,s,t,a[N],pr[N],le,ri,ad,prl,l,r,nxr,tree[2*N],tree2[2*N],xx,xx1;
void update1(long long idx, long long  val) {
     for (long long  i=idx; i<=N; i+=i&(-i)) {
          tree[i]+=val;
     }
}
long long getans1(long long  idx) {
     long long pas=0;
     for (long long  i=idx; i>0; i-=i&(-i)) {
          pas+=tree[i];
     }
     return pas;
}
void update2(long long  idx, long long  val) {
     for (long long  i=idx; i<=N; i+=i&(-i)) {
          tree2[i]+=val;
     }
}
long long getans2(long long  idx) {
     long long pas=0;
     for (long long  i=idx; i>0; i-=i&(-i)) {
          pas+=tree2[i];
     }
     return pas;
}
long long go(long long  a, long long  b) {
     if (a<b) return -abs(a-b)*s;
     else return abs(a-b)*t;
}
int main() {
     std::ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
     cin>>n>>m>>s>>t;
     for (int i=1; i<=n+1; i++) {
          cin>>a[i];
          update1(i,a[i]);
          update1(i+1, -a[i]);
     }
     //cout<<getans1(1)<<endl<<endl;
     pr[1]=0;
     for (int i=2; i<=n+1; i++) {
    		long long ww=go(a[i-1],a[i]);
    	//	cout<<i<<"    "<<ww<<endl;
          pr[i]=pr[i-1]+ww;
          update2(i,ww);
         // update2(i+1, -ww);
     }
    // cout<<getans2(n+1)<<endl<<endl<<endl;
     for (int i=1; i<=m; i++) {
          cin>>le>>ri>>ad;
          le++;
          ri++;
          l=getans1(le);
          prl=getans1(le-1);
          xx=go(prl,l);
          xx1=go(prl,l+ad);          
		  //cout<<prl<<" "<<l<<" "<<xx<<" "<<xx1<<endl;
          update2(le,xx1-xx);
          //cout<<getans2(n+1)<<endl<<endl;
          //update2(r+1, xx-xx1);
          r=getans1(ri);
          nxr=getans1(ri+1);
          
          xx=go(r,nxr);
          xx1=go(r+ad,nxr);//cout<<r<<" "<<nxr<<" "<<xx<<" "<<xx1<<endl;
          update2(ri+1, xx1-xx);
          cout<<getans2(n+1)<<endl;
          update1(le,ad);
          update1(ri+1, -ad);
     }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...