Submission #121628

#TimeUsernameProblemLanguageResultExecution timeMemory
121628dualityBitaro, who Leaps through Time (JOI19_timeleap)C++11
34 / 100
2029 ms17992 KiB
#define DEBUG 0 #include <bits/stdc++.h> using namespace std; #if DEBUG // basic debugging macros int __i__,__j__; #define printLine(l) for(__i__=0;__i__<l;__i__++){cout<<"-";}cout<<endl #define printLine2(l,c) for(__i__=0;__i__<l;__i__++){cout<<c;}cout<<endl #define printVar(n) cout<<#n<<": "<<n<<endl #define printArr(a,l) cout<<#a<<": ";for(__i__=0;__i__<l;__i__++){cout<<a[__i__]<<" ";}cout<<endl #define print2dArr(a,r,c) cout<<#a<<":\n";for(__i__=0;__i__<r;__i__++){for(__j__=0;__j__<c;__j__++){cout<<a[__i__][__j__]<<" ";}cout<<endl;} #define print2dArr2(a,r,c,l) cout<<#a<<":\n";for(__i__=0;__i__<r;__i__++){for(__j__=0;__j__<c;__j__++){cout<<setw(l)<<setfill(' ')<<a[__i__][__j__]<<" ";}cout<<endl;} // advanced debugging class // debug 1,2,'A',"test"; class _Debug { public: template<typename T> _Debug& operator,(T val) { cout << val << endl; return *this; } }; #define debug _Debug(), #else #define printLine(l) #define printLine2(l,c) #define printVar(n) #define printArr(a,l) #define print2dArr(a,r,c) #define print2dArr2(a,r,c,l) #define debug #endif // define #define MAX_VAL 999999999 #define MAX_VAL_2 999999999999999999LL #define EPS 1e-6 #define mp make_pair #define pb push_back // typedef typedef unsigned int UI; typedef long long int LLI; typedef unsigned long long int ULLI; typedef unsigned short int US; typedef pair<int,int> pii; typedef pair<LLI,LLI> plli; typedef vector<int> vi; typedef vector<LLI> vlli; typedef vector<pii> vpii; typedef vector<plli> vplli; // ---------- END OF TEMPLATE ---------- int L[300000],R[300000]; int T[300000],A[300000],B[300000],C[300000],D[300000]; int l[300000],r[300000]; LLI ans[300000]; struct func { LLI b,x1,x2; LLI b2,x3; int init() { b = x1 = 0,x2 = 1e12; b2 = 0,x3 = 1e12; } int apply(int l,int r) { if (x1 == x2) { if (b < l) b = l; else if (b > r) b2 += b-r,b = r; } else { if (l > b+x2-x1) x1 = x2 = 0,b = l; else if (l > b) x1 += l-b,b = l; if (r < b) { b2 += b-r,x3 = x1; x1 = x2 = 0,b = r; } else if (r < b+x2-x1) x2 = x3 = x2-(b+x2-x1-r); } return 0; } plli eval(int x) { LLI p,q; if (x < x1) p = b; else if (x < x2) p = b+x-x1; else p = b+x2-x1; if (x < x3) q = b2; else q = b2+x-x3; return mp(p,q); } }; func f[600]; int main() { int i,j; int N,Q; scanf("%d %d",&N,&Q); for (i = 0; i < N-1; i++) scanf("%d %d",&L[i],&R[i]); for (i = 0; i < Q; i++) { scanf("%d",&T[i]); if (T[i] == 1) scanf("%d %d %d",&A[i],&B[i],&C[i]),A[i]--,ans[i] = -1; else { scanf("%d %d %d %d",&A[i],&B[i],&C[i],&D[i]),A[i]--,C[i]--; if (A[i] == C[i]) ans[i] = max(B[i]-D[i],0); } } int rr; int bs = sqrt(N)+EPS; for (rr = 0; rr < 2; rr++) { for (i = 0; i < N-1; i++) l[i] = L[i]-i,r[i] = R[i]-i-1; for (i = 0; i < N/bs; i++) f[i].init(); for (i = 0; i < N-1; i++) f[i/bs].apply(l[i],r[i]); for (i = 0; i < Q; i++) { if (T[i] == 1) { l[A[i]] = B[i]-A[i],r[A[i]] = C[i]-A[i]-1; int b = A[i]/bs; f[b].init(); for (j = b*bs; j < min((b+1)*bs,N-1); j++) f[b].apply(l[j],r[j]); } else if ((T[i] == 2) && (A[i] < C[i])) { LLI t = B[i]-A[i],sum = 0; if (A[i]/bs == (C[i]-1)/bs) { for (j = A[i]; j < C[i]; j++) { if (t < l[j]) t = l[j]; else if (t > r[j]) sum += t-r[j],t = r[j]; } } else { for (j = A[i]; j < (A[i]/bs+1)*bs; j++) { if (t < l[j]) t = l[j]; else if (t > r[j]) sum += t-r[j],t = r[j]; } for (j = A[i]/bs+1; j < (C[i]-1)/bs; j++) { plli p = f[j].eval(t); sum += p.second,t = p.first; } for (j = ((C[i]-1)/bs)*bs; j < C[i]; j++) { if (t < l[j]) t = l[j]; else if (t > r[j]) sum += t-r[j],t = r[j]; } } if (t > (D[i]-C[i])) sum += t-(D[i]-C[i]); ans[i] = sum; } } reverse(L,L+N-1),reverse(R,R+N-1); for (i = 0; i < Q; i++) { if (T[i] == 1) A[i] = N-2-A[i]; else if (T[i] == 2) A[i] = N-1-A[i],C[i] = N-1-C[i]; } } for (i = 0; i < Q; i++) { if (ans[i] != -1) printf("%lld\n",ans[i]); } return 0; }

Compilation message (stderr)

timeleap.cpp: In member function 'int func::init()':
timeleap.cpp:65:58: warning: no return statement in function returning non-void [-Wreturn-type]
     int init() { b = x1 = 0,x2 = 1e12; b2 = 0,x3 = 1e12; }
                                                          ^
timeleap.cpp: In function 'int main()':
timeleap.cpp:96:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&N,&Q);
     ~~~~~^~~~~~~~~~~~~~~
timeleap.cpp:97:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (i = 0; i < N-1; i++) scanf("%d %d",&L[i],&R[i]);
                               ~~~~~^~~~~~~~~~~~~~~~~~~~~
timeleap.cpp:99:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&T[i]);
         ~~~~~^~~~~~~~~~~~
timeleap.cpp:100:66: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         if (T[i] == 1) scanf("%d %d %d",&A[i],&B[i],&C[i]),A[i]--,ans[i] = -1;
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
timeleap.cpp:102:64: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d %d %d %d",&A[i],&B[i],&C[i],&D[i]),A[i]--,C[i]--;
             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...