제출 #479970

#제출 시각아이디문제언어결과실행 시간메모리
479970cs142857원숭이와 사과 나무 (IZhO12_apple)C++17
100 / 100
316 ms98452 KiB
#include <cassert> #include <cctype> #include <climits> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <functional> #include <array> #include <vector> #include <string> #include <queue> #include <deque> #include <stack> #include <set> #include <map> #include <utility> #include <algorithm> #include <iostream> #include <sstream> #include <memory> #include <numeric> #include <unordered_map> #include <unordered_set> using namespace std; #ifdef DBG #define dbg 1 #define dpf(...) fprintf(stderr, __VA_ARGS__);fflush(stderr); #else #define dbg 0 #define dpf(...) 42 #endif #define SIZE(c) int((c).size()) #define REP(i,c) for(auto &i : (c)) #define ALL(c) (c).begin(),(c).end() #define pb push_back #define eb emplace_back #define fi first #define se second typedef long long i64; typedef unsigned long long u64; const double EPS = 1e-12; const int INF = 1e9 + 10; typedef vector<int> VI; typedef vector<string> VS; typedef pair<int, int> PI; template <typename T> inline void UpdateMax(T& x, T v) { x = max(x, v); } template <typename T> inline void UpdateMin(T& x, T v) { x = min(x, v); } template <typename T> using MinPQ = priority_queue<T, vector<T>, greater<T>>; // Dynamic Segment Tree base class. class SegTree { public: struct Node { int l = -1, r = -1; int sum = 0; char set = 0; }; vector<Node> a; int max_idx; using T = Node; SegTree() {} inline virtual void CombineNode(const T& lv, const T& rv, T& v) { v.sum = lv.sum + rv.sum; } void Init(int max_idx, int init_max_update = 0) { assert(max_idx >= -1); this->max_idx = max_idx; int m = max_idx + 1; int c = 1; while (m) { ++c; m >>= 1; } a.resize(1); a[0] = Node(); a.reserve(1 + c * init_max_update); } void RangeSet(int l, int r) { RangeSet(l, r, 0, max_idx, 0); } int QuerySum(int l, int r) { return QuerySum(l, r, 0, max_idx, 0); } void Debug() { if (!dbg) return; for(int i=0;i<SIZE(a);++i) { dpf("%d: %d %d, %d %d\n", i, a[i].sum, a[i].set, a[i].l, a[i].r); } } protected: inline void ApplySet(int l,int r,int p) { a[p].sum = r - l + 1; a[p].set = 1; } // Update p's children's lazy tags. virtual void PushDown(int l, int r, int p) { if (a[p].l < 0) { a[p].l = SIZE(a); a.emplace_back(); } if (a[p].r < 0) { a[p].r = SIZE(a); a.emplace_back(); } int m = (l + r) >> 1; if (a[p].set) { ApplySet(l, m, a[p].l); ApplySet(m + 1, r, a[p].r); a[p].set = 0; } } // Combines left and right children to current node. inline void PushUp(int p) { CombineNode(a[a[p].l], a[a[p].r], a[p]); } private: void RangeSet(int ql, int qr, int l, int r, int p) { dpf("RangeSet: %d %d, %d %d %d\n",ql,qr,l,r,p); if (ql > r || qr < l) return; if (ql <= l && qr >= r) { ApplySet(l, r, p); return; } PushDown(l, r, p); int m = (l + r) >> 1; RangeSet(ql, qr, l, m, a[p].l); RangeSet(ql, qr, m + 1, r, a[p].r); PushUp(p); } int QuerySum(int ql, int qr, int l, int r, int p) { if (ql > r || qr < l) return 0; if (ql <= l && qr >= r) return a[p].sum; PushDown(l, r, p); int m = (l + r) >> 1; int res = QuerySum(ql, qr, l, m, a[p].l) + QuerySum(ql, qr, m + 1, r, a[p].r); PushUp(p); return res; } }; SegTree st; int Query(int l, int r) { return st.QuerySum(l, r); } void Update(int l, int r) { st.RangeSet(l, r); } void Solve() { int nq; scanf("%d",&nq); st.Init(1000000000, nq); int C = 0; while(nq--) { int t,l,r; scanf("%d%d%d",&t,&l,&r); dpf("Query %d %d %d\n", t, l, r); l += C, r += C; if(t==1) { C = Query(l, r); printf("%d\n", C); } else { Update(l, r); } st.Debug(); } } int main() { int t = 1; // scanf("%d", &t); for (int i = 1; i <= t; ++i) { Solve(); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

apple.cpp: In member function 'void SegTree::Debug()':
apple.cpp:32:20: warning: statement has no effect [-Wunused-value]
   32 |   #define dpf(...) 42
      |                    ^~
apple.cpp:95:7: note: in expansion of macro 'dpf'
   95 |       dpf("%d: %d %d, %d %d\n", i, a[i].sum, a[i].set, a[i].l, a[i].r);
      |       ^~~
apple.cpp: In member function 'void SegTree::RangeSet(int, int, int, int, int)':
apple.cpp:32:20: warning: statement has no effect [-Wunused-value]
   32 |   #define dpf(...) 42
      |                    ^~
apple.cpp:128:5: note: in expansion of macro 'dpf'
  128 |     dpf("RangeSet: %d %d, %d %d %d\n",ql,qr,l,r,p);
      |     ^~~
apple.cpp: In function 'void Solve()':
apple.cpp:32:20: warning: statement has no effect [-Wunused-value]
   32 |   #define dpf(...) 42
      |                    ^~
apple.cpp:168:5: note: in expansion of macro 'dpf'
  168 |     dpf("Query %d %d %d\n", t, l, r);
      |     ^~~
apple.cpp:161:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |   scanf("%d",&nq);
      |   ~~~~~^~~~~~~~~~
apple.cpp:167:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  167 |     scanf("%d%d%d",&t,&l,&r);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...