Problem p02349 (C++) — buggy submission, verdict: Time Limit Exceeded

// #define debug
// //*******************************************************************************************************************************************

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// [Tips]
// XCode??§???EOF??\\??????Ctrl+D
// ?\\???Alt+\\
// ans???????§?INT?????????2,147,483,647????¶????????????¨??????????????§long
// long?????£??????????????????????????? 2?????°??¨??? = dout <<
// static_cast<bitset<8> >(x)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////
// AIZU
// Range Update Query (RUQ)
//
// Segment Tree??§????£?
////////////////////////////////////////

#ifdef debug
#include <chrono>
#endif

#include <algorithm> // next_permutation
#include <cmath>
#include <cstdio>
#include <cstring> //memcpy
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric> //accumulate
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
// #include <unordered_map> //hash func.
#include <fstream>  //ifstream, ofstream
#include <iterator> //insert_iterator::inserter
#include <set>

// #define NDEBUG //If NDEBUG is defined before #include <cassert>, assert will
// be ignored. You had better define NDEBUG when u submit the code.
#include <cassert> //assert

using namespace std;

#define dout cout
// If u wanna output to a text file instead of standard output, plz define
// OUTPUTFILE. #define OUTPUTFILE "output.txt"
// //************************************************************
#ifdef OUTPUTFILE
#define dout outputfile
ofstream outputfile(OUTPUTFILE);
#define OutputFilePath                                                         \\
  "/Users/Nag/Documents/Prgm/Test/DerivedData/Test/Build/Products/Debug/"      \\
  "output.txt"
#endif

#define din cin
// If u wanna input from a text file instead of standard input, plz define
// INPUTFROMTEXTFILE???. #define INPUTFILE "input.txt"
// //**************************************************************
#ifdef INPUTFILE
#define din inputfile
ifstream inputfile(INPUTFILE);
#endif

#define scand(A) scanf("%d", &(A))
#define scans(A) scanf("%s", (A))
#define printd(A) dout << "%d\\n", (A))
#define prints(A) dout << "%s\\n", (A))
#define disp(A) dout << #A << " = " << setw(3) << (A) << endl
#define disP(A) dout << setw(3) << (A) << " "
#define rep(i, a, n) for (int(i) = (a); (i) < (n); (i)++)
#define show(A, s, g)                                                          \\
  dout << #A << " = ";                                                         \\
  rep(__w, (s), (g)) { disP(A[__w]); }                                         \\
  dout << endl
#define showi(A, s, g)                                                         \\
  dout << #A << " = ";                                                         \\
  rep(__w, (s), (g)) { disP(__w); }                                            \\
  dout << endl
#define line dout << "----------------\\n"
#define line2 dout << "================\\n"

#define sign(x) ((x) > 0) - ((x) < 0) // x<0: -1, x=0: 0, x>0: +1
#define p(i) ((i) / 2)
#define l(i) ((i)*2)
#define r(i) ((i)*2 + 1)
#define sibling(i) (i ^ 1) // the other sibling of i (ex. 16^1 = 17, 17^1 = 16)
#define isRightChild(i) (i & 1)   // ex. 16&1 = 0, 17&1 = 1
#define isLeftChild(i) (!(i & 1)) // ex. 16&1 = 1, 17&1 = 0

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef vector<int> vi;
typedef long long ll;
typedef unsigned long long ull;

const int INF = (1LL << 31) - 1;
const int NONE = -1;
// const ll INF_LL = (ll)9e18-1LL; //Be careful for overflow.
// const ull INF_ULL = (ull)1e19-1ULL;
// #define MOD 1000000007
// //??§???????´???°?????£??¨??¨????????°????????????10???7??????

#define N_MAX 100010 // num of vertex or element
// #define M_MAX 124760 //num of edge
// #define DATA_MAX 1010

int N;
int M; // N????????§??????????°????2????????????????????????a[M]?????????????????¨??????
int a[N_MAX << 2]; // Segment Tree. Do not use a[0]

void display() {
#ifdef debug
  dout << "------------------------- display() ---------------------\\n";

  //    dout << "   "; showi(j,0,N+1);
  //    dout << "C[][] = \\n";
  //    rep(i,0,N+1) {
  //        disP(i); dout << " : ";
  //        rep(j,0,N+1) {
  //            disP(C[i][j]);
  //        }
  //        dout << endl;
  //    }
  //    dout << endl;

  showi(i, 1, M << 1);
  dout << "a = ";
  rep(i, 1, M << 1) disP(a[i] == INF ? 999 : a[i]);
  dout << endl;
  line;

  //    int w = 1;
  //    while(w<N) w<<=1;

  dout << "   ";
  showi(i, 0, M);

  for (int b = 1; b < M << 1; b <<= 1) {

    int m = M / b;

    disP(b);
    dout << " : ";
    rep(j, 0, M) {
      if (j % m == 0)
        disP(a[b + j / m] == INF ? 999 : a[b + j / m]);
      else
        disP("-");
    }
    dout << endl;
  }
  dout << endl;

  dout << "------------------------- end of display() ---------------------\\n";
#endif
}

void lazyUpdate(int i, int x) { // a[i]??????????????????x??§add??????

#ifdef debug
  dout << "lazyUpdate( i=" << i << ", x=" << x << " )\\n";
#endif

  if (i >= M << 1)
    return;

  if (M <= i and i < M << 1) {
    a[i] += x;
    return;
  }

  //?????????????????????????????°????????????
  lazyUpdate(l(i), x + a[i]);
  lazyUpdate(r(i), x + a[i]);
  a[i] = 0; // NONE;
}

void recursive_add(
    int i, int l, int r, int s, int t,
    int x) { //????????????[s,t)????????????x??§add??????????????????????????????a[i]??§???a[i]???????????????[l,r)????????°??§??????????????????
#ifdef debug
  dout << "--- rec_add( i=" << i << " a[i]?????????=[" << l << "," << r
       << ") | ??´??°??????=[" << s << "," << t << "), x=" << x << " )\\n";
#endif

  //??´??°????±???????[s,t)??¨???????????????????????????a[i]???????????????[l,r)??????????????????
  if (r <= s or t <= l) {
#ifdef debug
    dout << "????????????\\n";
#endif
    return;
  }

  //??´??°????±???????[s,t)??????????????????????????????a[i]???????????????[l,r)????????¨???????????????
  if (s <= l and r <= t) {
#ifdef debug
    dout << "????????????????????´??°????±???????????????¨?????????????????????"
            "\\n";
#endif
    a[i] += x;
    return;
  }

  //    //???????????§???a[i]?????´??°???????????£???????????´????????????????????±??????????????????????????????????????°????????????????????§???????????\\???
  //    //?????????????????´??????????????§?????¨???????????????????????°???????????§??\\???????????\\??§??????
  //    if( a[i]!=NONE ) {
  // #ifdef debug
  //        dout <<
  //        "a[i]????????§?????´??°???????????£??????????????§????????????????????±???????????????????????????\\n";
  // #endif
  //        lazyUpdate(i, a[i]);
  //        display();
  //    }

  //??????????????????????????°????????????
  recursive_add(l(i), l, (l + r) / 2, s, t, x);

  //??????????????????????????°????????????
  recursive_add(r(i), (l + r) / 2, r, s, t, x);
}

void add(int s, int t, int x) { //?????????[s,t]????????????x?????´??°??????
#ifdef debug
  dout << "--- add( s=" << s << ", t=" << t << ", x = " << x << " )\\n";
#endif

  recursive_add(1, 0, M, s, t + 1, x);
}

// void add(int s, int t, int x) {
// #ifdef debug
//     dout << "--- add( s=" << s << ", t=" << t << ", x = " << x << " )\\n";
// #endif
//
//     for(s+=N, t+=N; s<=t; s=p(s+1), t=p(t-1) ) {
//
//         //lazy add check
//         if( a[s]!=NONE ) {
//             lazyUpdate(s, a[s]);
//         }
//         if( a[t]!=NONE ) {
//             lazyUpdate(t, a[t]);
//         }
//
//         //normal procedure for add()
//         if( isRightChild(s) ) {
//             a[s] = x;
//         }
//         if( isLeftChild(t) ) {
//             a[t] = x;
//         }
//
//     }
// }

int get(int i) {

#ifdef debug
  dout << "--- get( i=" << i << " )\\n";
#endif

  int sum = a[M + i];

  for (int j = p(M + i); j > 0; j = p(j)) {
    sum += a[j];
  }

  return sum;
}

// int get(int i) {
//
// #ifdef debug
//     dout << "--- get( i=" << i << " )\\n";
// #endif
//
//     //lazy add check
//     for(int j=p(M+i); j>0; j=p(j)) {
//
////        if(a[j]!=NONE) {
//        if(a[j]!=0) {
// #ifdef debug
//        dout << "a[" << j << "] = " << a[j] << "
//        ??¨????????´??°???????????£??????????????§????????????????????±???????????????????????????\\n";
// #endif
////            lazyUpdate(j, a[j]);
//            lazyUpdate(j, 0);
//
//            display();
//        }
//    }
//
//    //just get
//    return a[M+i];
//
//}

void init() {

  // calc. M
  for (M = 1; M < N; M <<= 1)
    ;

  // init a[]
  rep(i, 0, M) { a[i] = 0; }
  rep(i, 0, M) { a[i + M] = 0; }
}

int main() {

  // cin, cout????????????
  // ?????¨??????cin?????????????????¨??¨cin??§???scanf?????????????????¨??¨scanf??§??±?????????????????????
  cin.tie(0);                  // cin??¨cout??????????????????
  ios::sync_with_stdio(false); // iostream??¨stdio??????????????????

  // read input data
  din >> N;
  init();

  int Q;
  din >> Q;

  //------------------------------------------------------------------------------------------
#ifdef debug
  // start timer
  auto startTime = chrono::system_clock::now();
#endif
  //------------------------------------------------------------------------------------------

  int q, s, t, x;
  rep(i, 0, Q) {

    display();

    din >> q;
    if (q) {
      din >> s;
      dout << get(s - 1) << endl;
    } else {
      din >> s >> t >> x;
      add(s - 1, t - 1, x);
    }
  }

#ifdef debug
  dout << "=== OUTPUT ===\\n";
#endif

  //------------------------------------------------------------------------------------------
#ifdef debug
  // stop timer
  auto endTime = chrono::system_clock::now();
  auto dur = endTime - startTime;
  auto msec = chrono::duration_cast<chrono::milliseconds>(dur).count();
  dout << fixed << setprecision(4) << (double)msec / 1000 << " sec \\n";
#ifdef OUTPUTFILE
  cout << fixed << setprecision(4) << (double)msec / 1000 << " sec \\n";
#endif
#endif
  //------------------------------------------------------------------------------------------

#ifdef INPUTFILE
  inputfile.close();
#endif

#ifdef OUTPUTFILE
  outputfile.close();
  cout << "\\"" << OutputFilePath << "\\"" << endl;
#endif

  return 0;
}

Error: TLE

Fixed submission:

// #define debug
// //*******************************************************************************************************************************************

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// [Tips]
// XCode??§???EOF??\\??????Ctrl+D
// ?\\???Alt+\\
// ans???????§?INT?????????2,147,483,647????¶????????????¨??????????????§long
// long?????£??????????????????????????? 2?????°??¨??? = dout <<
// static_cast<bitset<8> >(x)
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////
// AIZU
// Range Update Query (RUQ)
//
// Segment Tree??§????£?
////////////////////////////////////////

#ifdef debug
#include <chrono>
#endif

#include <algorithm> // next_permutation
#include <cmath>
#include <cstdio>
#include <cstring> //memcpy
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric> //accumulate
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
// #include <unordered_map> //hash func.
#include <fstream>  //ifstream, ofstream
#include <iterator> //insert_iterator::inserter
#include <set>

// #define NDEBUG //If NDEBUG is defined before #include <cassert>, assert will
// be ignored. You had better define NDEBUG when u submit the code.
#include <cassert> //assert

using namespace std;

#define dout cout
// If u wanna output to a text file instead of standard output, plz define
// OUTPUTFILE. #define OUTPUTFILE "output.txt"
// //************************************************************
#ifdef OUTPUTFILE
#define dout outputfile
ofstream outputfile(OUTPUTFILE);
#define OutputFilePath                                                         \\
  "/Users/Nag/Documents/Prgm/Test/DerivedData/Test/Build/Products/Debug/"      \\
  "output.txt"
#endif

#define din cin
// If u wanna input from a text file instead of standard input, plz define
// INPUTFROMTEXTFILE???. #define INPUTFILE "input.txt"
// //**************************************************************
#ifdef INPUTFILE
#define din inputfile
ifstream inputfile(INPUTFILE);
#endif

#define scand(A) scanf("%d", &(A))
#define scans(A) scanf("%s", (A))
#define printd(A) dout << "%d\\n", (A))
#define prints(A) dout << "%s\\n", (A))
#define disp(A) dout << #A << " = " << setw(3) << (A) << endl
#define disP(A) dout << setw(3) << (A) << " "
#define rep(i, a, n) for (int(i) = (a); (i) < (n); (i)++)
#define show(A, s, g)                                                          \\
  dout << #A << " = ";                                                         \\
  rep(__w, (s), (g)) { disP(A[__w]); }                                         \\
  dout << endl
#define showi(A, s, g)                                                         \\
  dout << #A << " = ";                                                         \\
  rep(__w, (s), (g)) { disP(__w); }                                            \\
  dout << endl
#define line dout << "----------------\\n"
#define line2 dout << "================\\n"

#define sign(x) ((x) > 0) - ((x) < 0) // x<0: -1, x=0: 0, x>0: +1
#define p(i) ((i) / 2)
#define l(i) ((i)*2)
#define r(i) ((i)*2 + 1)
#define sibling(i) (i ^ 1) // the other sibling of i (ex. 16^1 = 17, 17^1 = 16)
#define isRightChild(i) (i & 1)   // ex. 16&1 = 0, 17&1 = 1
#define isLeftChild(i) (!(i & 1)) // ex. 16&1 = 1, 17&1 = 0

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef vector<int> vi;
typedef long long ll;
typedef unsigned long long ull;

const int INF = (1LL << 31) - 1;
const int NONE = -1;
// const ll INF_LL = (ll)9e18-1LL; //Be careful for overflow.
// const ull INF_ULL = (ull)1e19-1ULL;
// #define MOD 1000000007
// //??§???????´???°?????£??¨??¨????????°????????????10???7??????

#define N_MAX 100010 // num of vertex or element
// #define M_MAX 124760 //num of edge
// #define DATA_MAX 1010

int N;
int M; // N????????§??????????°????2????????????????????????a[M]?????????????????¨??????
int a[N_MAX << 2]; // Segment Tree. Do not use a[0]

void display() {
#ifdef debug
  dout << "------------------------- display() ---------------------\\n";

  //    dout << "   "; showi(j,0,N+1);
  //    dout << "C[][] = \\n";
  //    rep(i,0,N+1) {
  //        disP(i); dout << " : ";
  //        rep(j,0,N+1) {
  //            disP(C[i][j]);
  //        }
  //        dout << endl;
  //    }
  //    dout << endl;

  showi(i, 1, M << 1);
  dout << "a = ";
  rep(i, 1, M << 1) disP(a[i] == INF ? 999 : a[i]);
  dout << endl;
  line;

  //    int w = 1;
  //    while(w<N) w<<=1;

  dout << "   ";
  showi(i, 0, M);

  for (int b = 1; b < M << 1; b <<= 1) {

    int m = M / b;

    disP(b);
    dout << " : ";
    rep(j, 0, M) {
      if (j % m == 0)
        disP(a[b + j / m] == INF ? 999 : a[b + j / m]);
      else
        disP("-");
    }
    dout << endl;
  }
  dout << endl;

  dout << "------------------------- end of display() ---------------------\\n";
#endif
}

void lazyUpdate(int i, int x) { // a[i]??????????????????x??§add??????

#ifdef debug
  dout << "lazyUpdate( i=" << i << ", x=" << x << " )\\n";
#endif

  if (i >= M << 1)
    return;

  if (M <= i and i < M << 1) {
    a[i] += x;
    return;
  }

  //?????????????????????????????°????????????
  lazyUpdate(l(i), x + a[i]);
  lazyUpdate(r(i), x + a[i]);
  a[i] = 0; // NONE;
}

void recursive_add(
    int i, int l, int r, int s, int t,
    int x) { //????????????[s,t)????????????x??§add??????????????????????????????a[i]??§???a[i]???????????????[l,r)????????°??§??????????????????
#ifdef debug
  dout << "--- rec_add( i=" << i << " a[i]?????????=[" << l << "," << r
       << ") | ??´??°??????=[" << s << "," << t << "), x=" << x << " )\\n";
#endif

  //??´??°????±???????[s,t)??¨???????????????????????????a[i]???????????????[l,r)??????????????????
  if (r <= s or t <= l) {
#ifdef debug
    dout << "????????????\\n";
#endif
    return;
  }

  //??´??°????±???????[s,t)??????????????????????????????a[i]???????????????[l,r)????????¨???????????????
  if (s <= l and r <= t) {
#ifdef debug
    dout << "????????????????????´??°????±???????????????¨?????????????????????"
            "\\n";
#endif
    a[i] += x;
    return;
  }

  //???????????§???a[i]?????´??°???????????£???????????´????????????????????±??????????????????????????????????????°????????????????????§???????????\\???
  //?????????????????´??????????????§?????¨???????????????????????°???????????§??\\???????????\\??§???????????????????????¨?????????????????????????????\\?????????????????¨???????????¨?????¨???????¨??????????????????£??????????????£???????????§NG????????????
  //    if( a[i]!=NONE ) {
  if (a[i] != 0) {
#ifdef debug
    dout << "a[i]????????§?????´??°???????????£??????????????§?????????????????"
            "???±???????????????????????????\\n";
#endif
    //        lazyUpdate(i, a[i]);
    lazyUpdate(i, 0);
    display();
  }

  //??????????????????????????°????????????
  recursive_add(l(i), l, (l + r) / 2, s, t, x);

  //??????????????????????????°????????????
  recursive_add(r(i), (l + r) / 2, r, s, t, x);
}

void add(int s, int t, int x) { //?????????[s,t]????????????x?????´??°??????
#ifdef debug
  dout << "--- add( s=" << s << ", t=" << t << ", x = " << x << " )\\n";
#endif

  recursive_add(1, 0, M, s, t + 1, x);
}

// void add(int s, int t, int x) {
// #ifdef debug
//     dout << "--- add( s=" << s << ", t=" << t << ", x = " << x << " )\\n";
// #endif
//
//     for(s+=N, t+=N; s<=t; s=p(s+1), t=p(t-1) ) {
//
//         //lazy add check
//         if( a[s]!=NONE ) {
//             lazyUpdate(s, a[s]);
//         }
//         if( a[t]!=NONE ) {
//             lazyUpdate(t, a[t]);
//         }
//
//         //normal procedure for add()
//         if( isRightChild(s) ) {
//             a[s] = x;
//         }
//         if( isLeftChild(t) ) {
//             a[t] = x;
//         }
//
//     }
// }

int get(int i) {

#ifdef debug
  dout << "--- get( i=" << i << " )\\n";
#endif

  // lazy add check
  for (int j = p(M + i); j > 0; j = p(j)) {

    //        if(a[j]!=NONE) {
    if (a[j] != 0) {
#ifdef debug
      dout << "a[" << j << "] = " << a[j]
           << " ??¨????????´??°???????????£??????????????§????????????????????"
              "±???????????????????????????\\n";
#endif
      //            lazyUpdate(j, a[j]);
      lazyUpdate(j, 0);

      display();
    }
  }

  // just get
  return a[M + i];
}

void init() {

  // calc. M
  for (M = 1; M < N; M <<= 1)
    ;

  // init a[]
  rep(i, 0, M) { a[i] = 0; }
  rep(i, 0, M) { a[i + M] = 0; }
}

int main() {

  // cin, cout????????????
  // ?????¨??????cin?????????????????¨??¨cin??§???scanf?????????????????¨??¨scanf??§??±?????????????????????
  cin.tie(0);                  // cin??¨cout??????????????????
  ios::sync_with_stdio(false); // iostream??¨stdio??????????????????

  // read input data
  din >> N;
  init();

  int Q;
  din >> Q;

  //------------------------------------------------------------------------------------------
#ifdef debug
  // start timer
  auto startTime = chrono::system_clock::now();
#endif
  //------------------------------------------------------------------------------------------

  int q, s, t, x;
  rep(i, 0, Q) {

    display();

    din >> q;
    if (q) {
      din >> s;
      dout << get(s - 1) << endl;
    } else {
      din >> s >> t >> x;
      add(s - 1, t - 1, x);
    }
  }

#ifdef debug
  dout << "=== OUTPUT ===\\n";
#endif

  //------------------------------------------------------------------------------------------
#ifdef debug
  // stop timer
  auto endTime = chrono::system_clock::now();
  auto dur = endTime - startTime;
  auto msec = chrono::duration_cast<chrono::milliseconds>(dur).count();
  dout << fixed << setprecision(4) << (double)msec / 1000 << " sec \\n";
#ifdef OUTPUTFILE
  cout << fixed << setprecision(4) << (double)msec / 1000 << " sec \\n";
#endif
#endif
  //------------------------------------------------------------------------------------------

#ifdef INPUTFILE
  inputfile.close();
#endif

#ifdef OUTPUTFILE
  outputfile.close();
  cout << "\\"" << OutputFilePath << "\\"" << endl;
#endif

  return 0;
}