結果

問題 No.879 Range Mod 2 Query
ユーザー okuraofvegetablokuraofvegetabl
提出日時 2020-02-12 00:42:00
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 4,887 bytes
コンパイル時間 2,240 ms
コンパイル使用メモリ 183,792 KB
実行使用メモリ 24,856 KB
最終ジャッジ日時 2024-04-08 22:46:34
合計ジャッジ時間 8,856 ms
ジャッジサーバーID
(参考情報)
judge15 / judge13
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,480 KB
testcase_01 AC 3 ms
6,548 KB
testcase_02 AC 4 ms
6,548 KB
testcase_03 AC 3 ms
6,548 KB
testcase_04 AC 4 ms
6,548 KB
testcase_05 AC 2 ms
6,548 KB
testcase_06 AC 2 ms
6,548 KB
testcase_07 AC 4 ms
6,548 KB
testcase_08 AC 4 ms
6,548 KB
testcase_09 AC 2 ms
6,548 KB
testcase_10 AC 3 ms
6,548 KB
testcase_11 TLE -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> P;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
// #define int long long
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000 //2e9
#define LLINF 1000000000000000000ll // 1e18
#define fi first
#define sec second
#define all(x) (x).begin(),(x).end()
#define sq(x) ((x)*(x))
#define dmp(x) cerr << #x << ": " << x << endl;

template<class T> void chmin(T& a,const T& b){if(a>b)a=b;}
template<class T> void chmax(T& a,const T& b){if(a<b)a=b;}

template<class T> using MaxHeap = priority_queue<T>;
template<class T> using MinHeap = priority_queue<T,vector<T>,greater<T>>;
template<class T> vector<T> vect(int len,T elem){ return vector<T>(len,elem); }

template<class T,class U>
ostream& operator << (ostream& os,const pair<T,U>& p){
  os << p.fi << ',' << p.sec; return os;
}
template<class T,class U>
istream& operator >> (istream& is,pair<T,U>& p){
  is >> p.fi >> p.sec; return is;
}
template<class T>
ostream& operator << (ostream &os,const vector<T> &vec){
  for(int i=0;i<vec.size();i++){
    os << vec[i];
    if(i+1<vec.size())os << ' ';
  }
  return os;
}
template<class T>
istream& operator >> (istream &is,vector<T>& vec){
  for(int i=0;i<vec.size();i++)is >> vec[i];
  return is;
}
void fastio(){
  cin.tie(0);
  ios::sync_with_stdio(0);
  cout<<fixed<<setprecision(20);
}

// verified https://judge.yosupo.jp/submission/3622

template<class D>
struct SegmentTreeBeats{
  using DMerger = function<D(D,D)>;
  vector<D> seg;
  int length;
  DMerger dm;
  D d_unit;
  SegmentTreeBeats(const vector<D>& vec,DMerger dm,D d_unit = D()):length(1),dm(dm){
    while(length<vec.size())length <<= 1;
    seg.assign(length*2,d_unit);
    for(int i=0;i<vec.size();i++){
      seg[i+length-1] = vec[i];
    }
    for(int i=length-2;i>=0;i--){
      seg[i] = dm(seg[i*2+1],seg[i*2+2]);
    }
  }
  template<class F,class... Args>
  void update(int a,int b,int k,int l,int r,F break_or_puttag,Args... args){
    if(r<=a||b<=l)return;
    if(a<=l&&r<=b&&(seg[k].*break_or_puttag)(args...))return;
    seg[k].pushdown(seg[k*2+1],seg[k*2+2]);
    update(a,b,k*2+1,l,(l+r)/2,break_or_puttag,args...);
    update(a,b,k*2+2,(l+r)/2,r,break_or_puttag,args...);
    seg[k] = dm(seg[k*2+1],seg[k*2+2]);
  }
  template<class F,class... Args>
  void update(int a,int b,F break_or_puttag,Args... args){
    update(a,b,0,0,length,break_or_puttag,args...);
  }
  template<class Getter,class QMerger,class Q>
  Q query(int a,int b,int k,int l,int r,Getter getter,QMerger qm,Q q_unit){
    if(r<=a||b<=l)return q_unit;
    if(a<=l&&r<=b)return (seg[k].*getter)();
    seg[k].pushdown(seg[k*2+1],seg[k*2+2]);
    Q lch = query(a,b,k*2+1,l,(l+r)/2,getter,qm,q_unit);
    Q rch = query(a,b,k*2+2,(l+r)/2,r,getter,qm,q_unit);
    return qm(lch,rch);
  }
  template<class Getter,class QMerger,class Q>
  Q query(int a,int b,Getter getter,QMerger qm,Q q_unit){
    return query(a,b,0,0,length,getter,qm,q_unit);
  }
};

// requirements :
// 
// static Data merge(Data l,Data r)
//
// void pushdown(Data& l,Data& r) (push down tag)
// 
// for each update query :
// bool break_or_puttag_[QUERY] (TAGTYPE tag)
//   if puttag condition is satisfied, update data and put tag
//   return : if break condition or puttag condition is satisfied, return true, otherwise return false

struct Data{
  ll tag,num,sum,mx,mi;
  Data(ll v = 0ll):tag(0ll),num(1ll),sum(v),mx(v),mi(v){}
  static Data merge(Data l,Data r){
    Data ret;
    ret.tag = 0ll;
    ret.num = l.num + r.num;
    ret.sum = l.sum + r.sum;
    ret.mx = max(l.mx,r.mx);
    ret.mi = min(l.mi,r.mi);
    return ret;
  }
  bool add(ll x){
    sum += num*x;
    mx += x;
    mi += x;
    tag += x;
    return true;
  }
  bool mod(ll x){
    if(mx<x)return true;
    if(mi==mx){
      ll rem = mx%x;
      add(rem-mx);
      return true;
    }
    return false;
  }
  void pushdown(Data& l,Data& r){
    l.add(tag);
    r.add(tag);
    tag = 0ll;
  }
  ll get_sum(){ return sum; }
  ll get_min(){ return mi; }
  ll get_max(){ return mx; }
};


void yukicoder879(){
  int N,Q;
  cin >> N >> Q;
  vector<Data> vec;
  for(int i=0;i<N;i++){
    int a;
    cin >> a;
    vec.emplace_back(a);
  }
  SegmentTreeBeats<Data> seg(vec,Data::merge);
  for(int i=0;i<Q;i++){
    int type,l,r;
    ll x;
    cin >> type;
    if(type==1){
      cin >> l >> r; l--;
      seg.update(l,r,&Data::mod,2);
    }
    if(type==2){
      cin >> l >> r >> x; l--;
      seg.update(l,r,&Data::add,x);
    }
    if(type==3){
      cin >> l >> r; l--;
      cout << seg.query(l,r,&Data::get_sum,[](ll x,ll y){return x+y;},0ll) << endl;
    }
  }
}



signed main(){
  fastio();
  // yosupo_RangeChminChmaxAddRangeSum();
  // AOJ_DSL_2_F();
  // AOJ_DSL_2_G();
  // AOJ_DSL_2_I();
  // AOJ_DSL_2_H();
  // HDU5306_GorgeousSequnence();
  yukicoder879();
  return 0;
}
0