Submission #287465

#TimeUsernameProblemLanguageResultExecution timeMemory
287465Namnamseo단층 (JOI16_ho_t5)C++17
100 / 100
547 ms26404 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pp; typedef pair<ll,ll> pll; void read(int& x){ scanf("%d",&x); } void read(ll& x){ scanf("%lld",&x); } void read(pp& x){ scanf("%d%d",&x.first, &x.second); } void read(pll& x){ scanf("%lld%lld",&x.first, &x.second); } template<typename T,typename... Args> void read(T& a,Args&... b){ read(a); read(b...); } #define all(x) (x).begin(),(x).end() #define pb push_back #define eb emplace_back #define x first #define y second #define rep(i,n) for(int i = 0; i < (n); ++i) #define rrep(i,n) for(int i = 1; i <= (n); ++i) #define sz(x) (int)(x).size() const int max_q = 200010, max_n2 = 524288; int n; int q; int qx[max_q]; int qd[max_q]; int ql[max_q]; ll lx[max_n2]; ll ly[max_n2]; ll x[max_n2]; ll y[max_n2]; inline void col(int p){ x[p]=x[p*2+1]; y[p]=y[p*2]; } inline void acq(int p, ll vx, ll vy){ x[p] += vx; lx[p] += vx; y[p] += vy; ly[p] += vy; } void init(int p=1, int pl=1, int pr=n){ if(pl == pr){ x[p]=pl-1; y[p]=-pl; return; } int mid = (pl+pr)/2; init(p*2, pl, mid); init(p*2+1, mid+1, pr); col(p); } void pd(int p){ acq(p*2, lx[p], ly[p]); acq(p*2+1, lx[p], ly[p]); lx[p] = 0; ly[p] = 0; } void upd(ll vx, ll vy, int l, int r, int p=1, int pl=1, int pr=n){ if(pl!=pr) pd(p); if(r<pl || pr<l) return; if(l<=pl && pr<=r){ acq(p, vx, vy); return; } int mid = (pl+pr)/2; upd(vx, vy, l, r, p*2, pl, mid); upd(vx, vy, l, r, p*2+1, mid+1, pr); col(p); } void dfs(int p=1, int pl=1, int pr=n){ if(pl == pr){ printf("%lld\n", -(x[p]+y[p])/2); return; } pd(p); int mid=(pl+pr)/2; dfs(p*2, pl, mid); dfs(p*2+1, mid+1, pr); } int main() { read(n, q); rep(i, q) read(qx[i], qd[i], ql[i]); init(); for(int i=q-1; 0<=i; --i){ if(qd[i] == 1){ ll v=-qx[i]; if(v > y[1]) continue; int p=1, pl=1, pr=n; while(pl != pr){ pd(p); int mid = (pl+pr)/2; if(y[p*2+1] >= v) p=p*2+1, pl=mid+1; else p=p*2, pr=mid; } upd(-2*ql[i], 0, 1, pl); } else { ll v=qx[i]; if(x[1] < v) continue; int p=1, pl=1, pr=n; while(pl != pr){ pd(p); int mid = (pl+pr)/2; if(x[p*2]<v) p=p*2+1, pl=mid+1; else p=p*2, pr=mid; } upd(0, -2*ql[i], pl, n); } } dfs(); return 0; }

Compilation message (stderr)

2016_ho_t5.cpp: In function 'void read(int&)':
2016_ho_t5.cpp:6:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    6 | void read(int& x){ scanf("%d",&x); }
      |                    ~~~~~^~~~~~~~~
2016_ho_t5.cpp: In function 'void read(ll&)':
2016_ho_t5.cpp:7:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    7 | void read(ll& x){ scanf("%lld",&x); }
      |                   ~~~~~^~~~~~~~~~~
2016_ho_t5.cpp: In function 'void read(pp&)':
2016_ho_t5.cpp:8:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    8 | void read(pp& x){ scanf("%d%d",&x.first, &x.second); }
      |                   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
2016_ho_t5.cpp: In function 'void read(pll&)':
2016_ho_t5.cpp:9:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    9 | void read(pll& x){ scanf("%lld%lld",&x.first, &x.second); }
      |                    ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...