Competitive programming with C++ requires fast I/O, efficient STL usage, and low-level optimizations.
Use ios_base::sync_with_stdio(false); cin.tie(NULL); to speed up cin/cout.
std::vector::reserve(n) avoids multiple reallocations when pushing many elements.
__builtin_popcount and bitmasking replace loops for bit operations.
Segment tree with iterative implementation (size power of two) is faster than recursive in contests.
The biggest mistake: not resetting data structures between test cases, causing wrong answers.
✦ Definition~90s read
What is Competitive Programming with C++?
Competitive programming with C++ is the art of writing fast, correct code under time pressure. C++ dominates because of its zero-cost abstractions, STL containers, and bit manipulation. The goal isn't just solving problems—it's solving them within microseconds. Every millisecond counts when 2 seconds is the limit.
★
Imagine you're a chef in a cooking competition.
Most Codeforces problems are designed so that O(n log n) in C++ passes, but any additional constant factor from careless implementation can push you into TLE. That's why the best competitors have a set of patterns they use without thinking.
Plain-English First
Imagine you're a chef in a cooking competition. You know how to cook, but winning means knowing which pan heats fastest, which knife cuts cleanest, and how to prep ingredients before the timer starts. Competitive programming is the same — you already know C++, but winning means knowing which data structure answers in microseconds instead of seconds, which algorithm avoids the timeout buzzer, and which one-liner replaces twenty lines of slow code. This article is your competition prep kit.
⚙ Browser compatibility
Latest versions — ✓ supported
Chrome
Firefox
Safari
Edge
✓
✓
✓
✓
Competitive programming isn't just about knowing algorithms — it's about knowing C++ well enough to implement the right algorithm under pressure, within memory limits, without subtle bugs. The difference between a 2-second AC and a TLE (Time Limit Exceeded) is often not the algorithm choice, but the implementation details: how you read input, which container you reach for, and whether you remembered to reserve vector capacity before pushing 200,000 elements. These micro-decisions compound across a 3-hour contest.
Most resources teach you what a segment tree is. Almost none teach you how to implement it so it fits in the standard competitive template, how to avoid the most common off-by-one errors in binary search, or when __builtin_popcount is faster than a loop. The gap between theory and rated performance lives in these details — and that gap is where most programmers stall.
By the end of this article, you'll have a battle-ready mental toolkit: a fast I/O setup that handles 10^6 integers without choking, a segment tree you can write from memory in 10 minutes, bitmask DP techniques for subset enumeration, and the STL tricks that top Codeforces and LeetCode coders use every day. You'll also know exactly when each technique earns its place and when it's overkill.
Here's what separates top 500 from the rest: they don't just know the algorithm — they know the exact C++ implementation that runs fastest on Codeforces' servers. For example, using std::endl instead of ' ' flushes the buffer and doubles I/O time. A segment tree built as vector<int> tree(2 * n) beats a recursive pointer-based one every time. These aren't theoretical — they're the difference between a green rating and a purple one.
What is Competitive Programming with C++?
Competitive programming with C++ is the art of writing fast, correct code under time pressure. C++ dominates because of its zero-cost abstractions, STL containers, and bit manipulation. The goal isn't just solving problems—it's solving them within microseconds. Every millisecond counts when 2 seconds is the limit.
Most Codeforces problems are designed so that O(n log n) in C++ passes, but any additional constant factor from careless implementation can push you into TLE. That's why the best competitors have a set of patterns they use without thinking.
competitive_template.cppC++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// TheCodeForge — Competitive programming template
#include <bits/stdc++.h>
using namespace std;
// Fast I/O
voidfast_io() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
voidsolve() {
// Problem solution goes here
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
// Example: compute sum
longlong sum = 0;
for (int x : a) sum += x;
cout << sum << '\n';
}
intmain() {
fast_io();
int t = 1;
// cin >> t; // Uncommentif multiple test cases
while (t--) solve();
return0;
}
Output
// No output — template structure
Mental Model
Forge Mental Model
Think of C++ as a race car: you need to know when to shift gears (choose the right data structure) and when to push the throttle (optimize loops).
STL containers have hidden costs (e.g., vector<bool> is a bitset, not a bool array).
Cache misses matter more in C++ than in interpreted languages — access memory sequentially.
Compiler optimizations (-O2) can change performance dramatically; test with and without.
Local variables are faster than globals — avoid excessive global arrays.
📊 Production Insight
Many contestants write code that passes small tests but fails on large input due to I/O overhead or hidden constant factors.
The fix is always in the template: fast I/O, reserve, and no endl.
Rule: Your template is your armor — invest in it before the contest.
🎯 Key Takeaway
C++ wins contests because of speed — but that speed is only delivered if you code with discipline.
The template is your foundation: get it right from day one.
Always compile with -O2 and test locally with large inputs.
When to Use C++ Over Other Languages
IfProblem requires tight time limits (e.g., Codeforces problem with 1s limit)
→
UseUse C++ for its raw speed and STL efficiency.
IfAlgorithm involves heavy container operations (set, map, priority_queue)
→
UseC++ STL is highly optimized; use it.
IfNeed to implement low-level bit manipulation (e.g., subset DP)
→
UseC++ offers __builtin_popcount, bitwise operators, and bitset.
IfLearning stage — just starting with algorithms
→
UsePython may be easier for prototyping, but switch to C++ for serious contests.
thecodeforge.io
Competitive Programming Cpp
Fast I/O: The First Optimization You Must Make
In competitive programming, reading and writing data can consume more time than the algorithm itself. C++’s default cin and cout are synchronized with C’s stdio, making them slow — they flush buffers on every read/write. Disabling this synchronization is the single biggest performance win you can get.
ios_base::sync_with_stdio(false) unties cin from scanf. cin.tie(NULL) prevents cout from flushing before each cin operation. Together they make cin/cout as fast as scanf/printf. Even faster: use getchar_unlocked for custom fast integer parsing — but beware: it's not thread-safe and not standard on all judges.
fast_io.cppC++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
intmain() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n; // fast even for10^6 integers
// Output with '\n' instead of endl
cout << n << '\n';
return0;
}
Output
// Reads an integer and prints it instantly
🔥Benchmark
Reading 1e6 integers with default cin: ~2.5 seconds. With sync disabled: ~0.5 seconds. That's a 5x speedup — often the difference between AC and TLE.
📊 Production Insight
Forgetting to disable sync is the #1 cause of TLE in easy problems.
Even if your algorithm is O(n), slow I/O can kill it.
Rule: Always call sync + tie before any input in main().
🎯 Key Takeaway
Fast I/O is not optional — it's the first thing you add to every contest solution.
Do not use endl; use '\n'.
Custom getchar_unlocked parser can be faster but use only if necessary.
Mastering STL for Speed
The C++ STL gives you powerful containers and algorithms, but misuse kills performance. The top coders know these rules: - Always reserve() space in vector when you know the final size. Each reallocation copies all elements — expensive. - Use std::set and std::map only when you need sorted order or logarithmic lookup. For unsorted key-value, std::unordered_map is faster (but beware of hash collisions — on Codeforces, custom hash may be needed). - std::priority_queue defaults to a max-heap. For min-heap, use greater<int>. - Custom comparators can be passed as lambdas to std::sort, set, etc. Lambdas are inline-able and fast.
stl_tricks.cppC++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
intmain() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector<int> v;
v.reserve(n); // prevent reallocations
for (int i = 0; i < n; i++) {
int x;
cin >> x;
v.push_back(x);
}
// Sort descending with lambda
sort(v.begin(), v.end(), [](int a, int b) {
return a > b;
});
// Use set with custom comparator
auto cmp = [](int a, int b) { return a > b; };
set<int, decltype(cmp)> s(cmp);
s.insert(5); s.insert(1); s.insert(3);
// Printset (descending order)
for (int x : s) cout << x << ' ';
cout << '\n';
return0;
}
Output
// For input: 3 7 2 9
// Sorted vector: 9 7 2
// Set output: 5 3 1
⚠ Performance Trap
std::vector<bool> is NOT a container of bools — it's a bitset. Accessing elements is slower and iterators dereference to proxies. Use std::vector<char> or bitset<n> if you need bit-level storage.
📊 Production Insight
Using std::set when an array + sort would do adds log factor and heap allocations.
Also, std::unordered_map on Codeforces can be slow due to hash collisions — use a custom hash or switch to map if time is tight.
Rule: Know the hidden costs of each container.
🎯 Key Takeaway
Reserve vector capacity; prefer sorted array over set when possible.
Custom comparators via lambdas are cleaner and faster than function pointers.
Avoid vector<bool> in performance-critical sections.
thecodeforge.io
Competitive Programming Cpp
Bit Manipulation and Bitmasking
Bit manipulation is a superpower in competitive programming. Operations like checking if a number is power of two, counting set bits, and enumerating subsets are all done with bitwise operators. C++ provides __builtin_popcount (and __builtin_popcountll for 64-bit) that map to a single CPU instruction — faster than any loop.
Bitmasking is key for DP on subsets: represent a set of items as an integer where bit i indicates inclusion. Enumerating all subsets of a set of size n takes O(2^n). For each subset, you can iterate over its elements using (mask & -mask) to get the lowest set bit.
bitmask.cppC++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
using namespace std;
intmain() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n = 5;
// Enumerate all subsets of {0..n-1}
for (int mask = 0; mask < (1 << n); mask++) {
cout << "Subset: ";
for (int i = 0; i < n; i++) {
if (mask & (1 << i))
cout << i << ' ';
}
cout << '\n';
}
// Count set bits
int x = 29; // 11101 in binary
cout << "Popcount of 29: " << __builtin_popcount(x) << '\n';
// Iterate over set bits
for (int sub = x; sub; sub &= sub - 1) {
int lsb = sub & -sub;
// process lsb
}
return0;
}
Output
// Prints subsets and popcount
💡Pro Tip
For subset DP, common pattern: dp[mask] = min(dp[mask], dp[mask ^ (1<<i)] + cost) where i is an element. Use __builtin_ctz to quickly get index of lowest set bit.
📊 Production Insight
Using a loop to count bits instead of __builtin_popcount can be 10x slower.
Incorrect shifting (e.g., 1<<n where n is large) causes undefined behavior.
Rule: Always use builtins for bit operations when available.
🎯 Key Takeaway
Bitmask DP is essential for problems where n <= 20.
__builtin_popcount is your friend.
Iterate over subsets efficiently with sub = (sub-1) & mask trick.
Segment Trees for Fast Range Queries
Segment trees answer range queries (sum, min, max) and point updates in O(log n). The iterative (non-recursive) implementation is much faster in contests because it avoids recursion overhead and cache misses. Build the tree as an array of size 2*n (with n a power of two). For a range sum query, you walk from l+n to r+n, adding values at leaf nodes.
For lazy propagation (range updates), the recursive version is easier but still slower. The iterative version with a separate lazy array is possible but tricky. Most contest problems can be solved with the iterative segment tree + point updates. Save recursion for when you truly need lazy propagation.
segment_tree.cppC++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> t;
voidbuild() {
// t already has size 2*n
for (int i = n - 1; i > 0; i--)
t[i] = t[i<<1] + t[i<<1|1];
}
voidupdate(int pos, int value) {
for (t[pos += n] = value; pos > 1; pos >>= 1)
t[pos>>1] = t[pos] + t[pos^1];
}
intquery(int l, int r) { // inclusive [l, r)
int res = 0;
for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
if (l&1) res += t[l++];
if (r&1) res += t[--r];
}
return res;
}
intmain() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n;
// Next power of two
int sz = 1;
while (sz < n) sz <<= 1;
n = sz;
t.resize(2*n);
// Read initial values into t[n..n+orig_n-1]
for (int i = 0; i < n; i++) cin >> t[i + n];
build();
// Example: query sum of indices 0 to 4 (exclusive)
cout << query(0, 5) << '\n';
return0;
}
Output
// For input: 5
// 1 2 3 4 5
// Query [0,5): 15
Mental Model
Iterative Segment Tree Mental Model
Think of the tree as a complete binary tree stored in an array. Leaves occupy indices n to 2n-1. Internal nodes are computed from children.
Tree size is 2*next_power_of_two(n).
Update: set leaf, then walk up updating parents.
Query: move l and r pointers up, adding values when they are right/left children.
No recursion — straight loop, very cache-friendly.
📊 Production Insight
Using recursive segment tree with dynamic allocation can cause TLE due to stack overhead and pointer chasing.
Always use iterative version unless lazy propagation is required.
Rule: Write the iterative tree from memory — it's shorter and faster.
🎯 Key Takeaway
Iterative segment tree (2n size) beats recursive every time.
Build, update, query — three loops, no recursion.
For lazy propagation, learn recursive version only when necessary.
Debugging Strategies That Win Contests
Even the best code sometimes fails. The key is to debug efficiently without wasting contest time. Use these strategies: - Stress testing: Write a brute-force solution for small input and compare with your optimized solution on random test cases. This catches wrong logic early. - Assertions: Use assert() to verify invariants — array indices within bounds, sums not overflowing. If an assertion fails, you get immediate feedback. - Print debugging: Use cerr or comment out cout for debug output. Don't forget to remove before submission. - Local testing: Compile with -g -O2 -fsanitize=undefined to catch out-of-bounds and integer overflow.
stress_test.cppC++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;
// Optimized solution
intsolve(vector<int>& a) {
int n = a.size();
longlong sum = 0;
for (int x : a) sum += x;
assert(sum >= 0); // sanity check
return sum;
}
// Brute force for small n
intbrute(vector<int>& a) {
int n = a.size();
int sum = 0;
for (int i = 0; i < n; i++) sum += a[i];
return sum;
}
intmain() {
srand(time(0));
for (int test = 0; test < 1000; test++) {
int n = rand() % 10 + 1;
vector<int> a(n);
for (int i = 0; i < n; i++) a[i] = rand() % 100;
if (solve(a) != brute(a)) {
cout << "Mismatch! Test: ";
for (int x : a) cout << x << ' ';
cout << '\n';
return0;
}
}
cout << "All good!" << '\n';
return0;
}
Output
// Runs 1000 random tests, prints mismatch or success
⚠ Common Pitfall
Never submit code with cerr or print statements — they will cause TLE or WA. Always comment them out or use a macro like #define dbg(x) if(0) cout << x.
📊 Production Insight
Writing a brute-force for small n takes 2 minutes and saves you from wrong solutions.
Assertions during contest can detect overflow that sample tests won't catch.
Rule: If you have time, always stress test — especially for problems with many edge cases.
🎯 Key Takeaway
Stress testing is the most reliable way to find bugs.
Use assert() to enforce invariants.
Compile with sanitizers locally — they catch undefined behavior early.
Dynamic Memory: Don't Let the Arena Leak
In competitive programming, you don't have time for garbage collection. You build, you use, you tear down. Manual memory management with new and delete is your scalpel — fast, precise, but sharp enough to cut you. The 'why' is performance: allocation on the heap can outrun stack allocation for large arrays, but you own that chunk. Forgot to delete[] after a new int[n]? That's a memory leak. In a 2-hour contest, that crashes your solution on test case 47. Here's the rule: every new gets a delete. Every malloc gets a free. Better yet, use std::vector and let RAII handle cleanup. But when you need raw speed and control — like implementing a custom allocator for a graph with a billion edges — you go manual. Know the cost: allocation is O(1), but fragmentation kills cache. Pre-allocate. Reuse pools. Measure twice, delete once.
Always match new[] with delete[] — not delete. Mismatch invokes undefined behavior. Your judge may not catch it, but Valgrind will.
🎯 Key Takeaway
Pre-allocate your memory in one big chunk to avoid fragmentation and speed up allocation.
OOP in CP: When and Why to Write a Class
Object Oriented Programming in competitive programming? Most red coders will tell you: 'Don't. Just use structs.' But they're wrong — sometimes. The 'why' is encapsulation of state and behavior. When you have a complex data structure like a red-black tree or a disjoint set union, shoving methods inside a class keeps the mess contained. You get const correctness, you get RAII, you get a single point of truth. The 'how' is brutal simplicity: no inheritance hierarchies, no virtual dispatch. That's a cache miss you can't afford. Write a class as a struct with private members and inline functions. Mark everything const that can be. Use explicit on single-argument constructors to avoid implicit conversions that silently blow up your algorithm. Example: a matrix class for linear algebra in geometry problems. The moment you need to pass a matrix to ten different functions, a class stops the bleeding. Just keep the vtable on the bench.
dsu_class.cppCPP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// io.thecodeforge
#include <vector>
classDisjointSetUnion {
mutable std::vector<int> parent, rank;
public:
explicitDisjointSetUnion(int n) : parent(n), rank(n, 0) {
for (int i = 0; i < n; ++i) parent[i] = i;
}
intfind(int x) const {
if (parent[x] != x) parent[x] = find(parent[x]); // path compressionreturn parent[x];
}
voidunite(int a, int b) {
int pa = find(a), pb = find(b);
if (pa == pb) return;
if (rank[pa] < rank[pb]) parent[pa] = pb;
elseif (rank[pa] > rank[pb]) parent[pb] = pa;
else { parent[pb] = pa; rank[pa]++; }
}
};
// Usage:// DSU dsu(1000);// dsu.unite(3, 7);// bool same = dsu.find(3) == dsu.find(7);
🔥Design Decision:
Make findconst and mark parent as mutable. This lets you cache results on reads without breaking const-correctness — vital for debugging.
🎯 Key Takeaway
Use classes only for non-trivial state machines; keep methods inline and avoid vtables. Readability matters when you debug at 2am.
● Production incidentPOST-MORTEMseverity: high
TLE from a Missing Sync
Symptom
Solution passed all sample cases and small test cases but timed out on large input (n=200k).
Assumption
The algorithm was O(n) — should pass easily within 1 second.
Root cause
Used cin and cout without disabling synchronization with ios_base::sync_with_stdio(false) and cin.tie(NULL). Each integer read triggered a flush, turning a 20ms read into 2s.
Fix
Added the two lines at the start of main(). Replaced endl with '\n'.
Key lesson
Always include fast I/O in your competitive programming template.
Never assume standard I/O is fast enough — it isn't.
One missing line can cost you the problem — and the contest.
Production debug guideSymptom → Action guide for common contest problems.4 entries
Symptom · 01
TLE despite O(n) algorithm
→
Fix
Check I/O: ensure sync is off, use '\n', avoid endl. If still TLE, profile loops for hidden O(n²) (e.g., vector push_back without reserve).
Symptom · 02
Wrong answer on large test, passes small
→
Fix
Check integer overflow (use long long), array bounds (off-by-one), and uninitialized variables. Write a brute-force for small n and compare outputs.
Symptom · 03
Runtime error (segfault) on test case 4
→
Fix
Check out-of-bounds vector access, null pointer dereference, or stack overflow. Use -fsanitize=address locally.
Symptom · 04
Memory limit exceeded
→
Fix
Reduce space: use iterative segment tree (2n) instead of recursive with nodes. Use std::vector::shrink_to_fit() if needed. Avoid storing unnecessary copies.
★ Quick Debug Commands for Competitive ProgrammingUse these when you're stuck mid-contest.
You now understand what Competitive Programming with C++ is and why it exists
2
You've seen it working in a real runnable example
3
Practice daily
the forge only works when it's hot 🔥
4
Always enable fast I/O at the start of every solution.
5
Use iterative segment trees for faster range queries.
6
Bitmask DP is your go-to for subset problems.
7
Stress test with brute force to catch wrong logic early.
Common mistakes to avoid
5 patterns
×
Memorising syntax without understanding
Symptom
Can recall __builtin_popcount but don't know when to use it instead of a loop.
Fix
Practice problems that require bit manipulation to build intuition.
×
Skipping practice, only reading theory
Symptom
Know all algorithms but can't implement them in contest due to lack of muscle memory.
Fix
Set a daily practice goal: solve at least one problem per day from Codeforces or LeetCode.
×
Not clearing data structures between test cases
Symptom
Earlier test case's leftovers cause wrong answer on next case.
Fix
Declare variables inside solve() or reset globals explicitly at start of each case.
×
Using `std::vector<bool>` in performance-critical code
Symptom
Unexpectedly slow operations and weird proxy reference behavior.
Fix
Use std::vector<char> or std::bitset instead.
×
Forgetting to use `long long` for sums that may exceed 32-bit
Symptom
Overflow gives wrong answer on large test cases.
Fix
Always use long long for variables that accumulate sums or products.
INTERVIEW PREP · PRACTICE MODE
Interview Questions on This Topic
Q01SENIOR
How would you implement a segment tree in a contest environment for maxi...
Q02JUNIOR
What is the fastest way to read input in C++ for competitive programming...
Q03SENIOR
Explain how to enumerate all subsets of a set of size n using bitmasking...
Q04SENIOR
What are the trade-offs between recursive and iterative segment tree imp...
Q01 of 04SENIOR
How would you implement a segment tree in a contest environment for maximum speed?
ANSWER
Use an iterative segment tree with size = next power of two. Store the tree in a vector of size 2*n. Build by looping from n-1 down to 1. Update by setting leaf at position+n then walking up to root. Query by moving l and r pointers from leaves upward, accumulating values from leaves that are right children (l&1) or left children (r&1 but then decrement r). No recursion, no stack overhead.
Q02 of 04JUNIOR
What is the fastest way to read input in C++ for competitive programming?
ANSWER
The fastest standard method is using ios_base::sync_with_stdio(false); cin.tie(NULL); and then using cin normally. For even faster custom parsing, use getchar_unlocked() in a custom fast integer reader function (careful: not thread-safe and not available on all judges). Avoid scanf/printf if you're mixing with cin/cout after sync — it's inconsistent.
Q03 of 04SENIOR
Explain how to enumerate all subsets of a set of size n using bitmasking.
ANSWER
Represent each subset as an integer mask from 0 to (1<<n)-1, where bit i is 1 if element i is included. Loop through masks: for (int mask = 0; mask < (1<<n); ++mask). To iterate over the elements of a subset efficiently, use for (int sub = mask; sub; sub &= sub - 1) and get the lowest set bit with int lsb = sub & -sub; and its index with __builtin_ctz(lsb). This is O(2^n) total, which works for n <= 20.
Q04 of 04SENIOR
What are the trade-offs between recursive and iterative segment tree implementations?
ANSWER
Iterative (2n array): faster (no recursion, cache-friendly), simpler for point updates and range queries, but harder to extend to lazy propagation. Recursive: easier to implement lazy propagation (range updates), but slower due to function calls and dynamic allocation. For contests: use iterative when no lazy needed, use recursive with a static array (size 4*n) when lazy is required. The iterative version also typically uses half the memory.
01
How would you implement a segment tree in a contest environment for maximum speed?
SENIOR
02
What is the fastest way to read input in C++ for competitive programming?
JUNIOR
03
Explain how to enumerate all subsets of a set of size n using bitmasking.
SENIOR
04
What are the trade-offs between recursive and iterative segment tree implementations?
SENIOR
FAQ · 5 QUESTIONS
Frequently Asked Questions
01
What is Competitive Programming with C++ in simple terms?
Competitive Programming with C++ is using the C++ language to solve algorithmic problems in contests like Codeforces, AtCoder, and LeetCode. It's about writing code that is both correct and fast enough to pass time limits.
Was this helpful?
02
What is the single most important C++ optimization for contests?
Fast I/O: always add ios_base::sync_with_stdio(false); cin.tie(NULL); at the start of main, and use ' ' instead of endl. This alone can make the difference between TLE and AC.
Was this helpful?
03
Should I use `vector` in competitive programming?
No. vector<bool> is a bitset specialization that is slower and does not provide references to bools. Use vector<char> or bitset<N> instead.
Was this helpful?
04
How do I debug a TLE during a contest?
First, check I/O optimization. Then look for accidental O(n²) behavior: nested loops, repeated linear searches inside a loop, or vector reallocations. Use a profiler locally or add timing macros to identify slow sections.
Was this helpful?
05
Is it worth learning recursive segment tree with lazy propagation?
Yes — for problems that require range updates (add to range, assign range), lazy propagation is essential. The recursive version is easier to understand for lazy. But for simple point updates, stick with iterative.