Submission #245292

#TimeUsernameProblemLanguageResultExecution timeMemory
245292kimbj0709Foehn Phenomena (JOI17_foehn_phenomena)C++14
100 / 100
872 ms18540 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 200050
vector<int> seg(maxn*4,0),lazy(maxn*4,0);
vector<int> vect1;
void build(int node,int start,int end){
  if(start==end){
    seg[node] = vect1[start];
    return;
  }
  int mid = (start+end)/2;
  build(node*2+1,start,mid);
  build(node*2+2,mid+1,end);
}
void update(int node,int start,int end,int rangemin,int rangemax,int val){
    if(lazy[node]!=0){
      seg[node] += lazy[node];
      if(start!=end){
        lazy[node*2+1] += lazy[node];
        lazy[node*2+2] += lazy[node];
      }
      lazy[node] = 0;
    }
    if(start>rangemax||end<rangemin){
        return;
    }
    else if(start>=rangemin&&end<=rangemax){
        seg[node] += val;
        if(start!=end){
          lazy[node*2+1] += val;
          lazy[node*2+2] += val;
        }
        return;
    }
    int mid = (start+end)/2;
    update(node*2+1,start,mid,rangemin,rangemax,val);
    update(node*2+2,mid+1,end,rangemin,rangemax,val);
    seg[node] = seg[node*2+1]+seg[node*2+2];

}
int query(int node,int start,int end,int pos){
    if(lazy[node]!=0){
      seg[node] += lazy[node];
      if(start!=end){
        lazy[node*2+1] += lazy[node];
        lazy[node*2+2] += lazy[node];
      }
      lazy[node] = 0;
    }
    if(start==end&&start==pos){
      return seg[node];
    }
    int mid = (start+end)/2;
    if(pos<=mid){
      return query(node*2+1,start,mid,pos);
    }
    else{
      return query(node*2+2,mid+1,end,pos);
    }
}
int32_t main() {
  ios::sync_with_stdio(0);
  int no_of_input,no_of_query,up,down;
  int input,input1,input2,input3;
  cin >> no_of_input >> no_of_query >> up >> down;
  for(int i=0;i<=no_of_input;i++){
    cin >> input;
    vect1.push_back(input);
  }
  int cntup = 0;
  int cntdown = 0;
  for(int i=1;i<vect1.size();i++){
    if(vect1[i]>vect1[i-1]){
      cntup += abs(vect1[i]-vect1[i-1]);
    }
    else{
      cntdown += abs(vect1[i]-vect1[i-1]);
    }
  }
  build(0,0,vect1.size()-1);
  //cout << cntup << ' ' << cntdown << "\n";
  for(int i=0;i<no_of_query;i++){
    cin >> input1 >> input2 >> input3;
    //input1--,input2--;
    if(input1!=0){
      int before = query(0,0,vect1.size()-1,input1-1);
      int curr = query(0,0,vect1.size()-1,input1);
      if(curr>before){
        cntup -= abs(curr-before);
      }
      else{
        cntdown -= abs(curr-before);
      }
      curr += input3;
      if(curr>before){
        cntup += abs(curr-before);
      }
      else{
        cntdown += abs(curr-before);
      }
    }
    //cout << cntup << " " << cntdown << "---\n";
    if(input2!=vect1.size()-1){
      int next = query(0,0,vect1.size()-1,input2+1);
      int curr = query(0,0,vect1.size()-1,input2);
      if(next>curr){
        cntup -= abs(next-curr);
      }
      else{
        cntdown -= abs(next-curr);
      }
      curr += input3;
      if(next>curr){
        cntup += abs(next-curr);
      }
      else{
        cntdown += abs(next-curr);
      }
    }
    //cout << cntup << " " << cntdown << "--\n";
    update(0,0,vect1.size()-1,input1,input2,input3);
    cout << cntdown*down-cntup*up << "\n";
  }
}

Compilation message (stderr)

foehn_phenomena.cpp: In function 'int32_t main()':
foehn_phenomena.cpp:73:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=1;i<vect1.size();i++){
               ~^~~~~~~~~~~~~
foehn_phenomena.cpp:104:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(input2!=vect1.size()-1){
        ~~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...