How to get better? - Codeforces

october 2019 by nhaliday

specifically: better at Marathon/optimization problems

oly-programming
practice
oly
problem-solving
discussion
learning
accretion
growth
studying
wire-guided
strategy
ORFE
optimization
quixotic
october 2019 by nhaliday

[Tutorial] A way to Practice Competitive Programming : From Rating 1000 to 2400+ - Codeforces

august 2019 by nhaliday

this guy really didn't take that long to reach red..., as of today he's done 20 contests in 2y to my 44 contests in 7y (w/ a long break)...>_>

tho he has 3 times as many submissions as me. maybe he does a lot of virtual rounds?

some snippets from the PDF guide linked:

1400-1900:

To be rating 1900, skills as follows are needed:

- You know and can use major algorithms like these:

Brute force DP DFS BFS Dijkstra

Binary Indexed Tree nCr, nPr Mod inverse Bitmasks Binary Search

- You can code faster (For example, 5 minutes for R1100 problems, 10 minutes for

R1400 problems)

If you are not good at fast-coding and fast-debugging, you should solve AtCoder problems. Actually, and statistically, many Japanese are good at fast-coding relatively while not so good at solving difficult problems. I think that’s because of AtCoder.

I recommend to solve problem C and D in AtCoder Beginner Contest. On average, if you can solve problem C of AtCoder Beginner Contest within 10 minutes and problem D within 20 minutes, you are Div1 in FastCodingForces :)

...

Interestingly, typical problems are concentrated in Div2-only round problems. If you are not good at Div2-only round, it is likely that you are not good at using typical algorithms, especially 10 algorithms that are written above.

If you can use some typical problem but not good at solving more than R1500 in Codeforces, you should begin TopCoder. This type of practice is effective for people who are good at Div.2 only round but not good at Div.1+Div.2 combined or Div.1+Div.2 separated round.

Sometimes, especially in Div1+Div2 round, some problems need mathematical concepts or thinking. Since there are a lot of problems which uses them (and also light-implementation!) in TopCoder, you should solve TopCoder problems.

I recommend to solve Div1Easy of recent 100 SRMs. But some problems are really difficult, (e.g. even red-ranked coder could not solve) so before you solve, you should check how many percent of people did solve this problem. You can use https://competitiveprogramming.info/ to know some informations.

1900-2200:

To be rating 2200, skills as follows are needed:

- You know and can use 10 algorithms which I stated in pp.11 and segment trees

(including lazy propagations)

- You can solve problems very fast: For example, 5 mins for R1100, 10 mins for

R1500, 15 mins for R1800, 40 mins for R2000.

- You have decent skills for mathematical-thinking or considering problems

- Strong mental which can think about the solution more than 1 hours, and don’t give up even if you are below average in Div1 in the middle of the contest

This is only my way to practice, but I did many virtual contests when I was rating 2000. In this page, virtual contest does not mean “Virtual Participation” in Codeforces. It means choosing 4 or 5 problems which the difficulty is near your rating (For example, if you are rating 2000, choose R2000 problems in Codeforces) and solve them within 2 hours. You can use https://vjudge.net/. In this website, you can make virtual contests from problems on many online judges. (e.g. AtCoder, Codeforces, Hackerrank, Codechef, POJ, ...)

If you cannot solve problem within the virtual contests and could not be able to find the solution during the contest, you should read editorial. Google it. (e.g. If you want to know editorial of Codeforces Round #556 (Div. 1), search “Codeforces Round #556 editorial” in google) There is one more important thing to gain rating in Codeforces. To solve problem fast, you should equip some coding library (or template code). For example, I think that equipping segment tree libraries, lazy segment tree libraries, modint library, FFT library, geometry library, etc. is very effective.

2200 to 2400:

Rating 2200 and 2400 is actually very different ...

To be rating 2400, skills as follows are needed:

- You should have skills that stated in previous section (rating 2200)

- You should solve difficult problems which are only solved by less than 100 people in Div1 contests

...

At first, there are a lot of educational problems in AtCoder. I recommend you should solve problem E and F (especially 700-900 points problem in AtCoder) of AtCoder Regular Contest, especially ARC058-ARC090. Though old AtCoder Regular Contests are balanced for “considering” and “typical”, but sadly, AtCoder Grand Contest and recent AtCoder Regular Contest problems are actually too biased for considering I think, so I don’t recommend if your goal is gain rating in Codeforces. (Though if you want to gain rating more than 2600, you should solve problems from AtCoder Grand Contest)

For me, actually, after solving AtCoder Regular Contests, my average performance in CF virtual contest increased from 2100 to 2300 (I could not reach 2400 because start was early)

If you cannot solve problems, I recommend to give up and read editorial as follows:

Point value 600 700 800 900 1000-

CF rating R2000 R2200 R2400 R2600 R2800

Time to editorial 40 min 50 min 60 min 70 min 80 min

If you solve AtCoder educational problems, your skills of competitive programming will be increased. But there is one more problem. Without practical skills, you rating won’t increase. So, you should do 50+ virtual participations (especially Div.1) in Codeforces. In virtual participation, you can learn how to compete as a purple/orange-ranked coder (e.g. strategy) and how to use skills in Codeforces contests that you learned in AtCoder. I strongly recommend to read editorial of all problems except too difficult one (e.g. Less than 30 people solved in contest) after the virtual contest. I also recommend to write reflections about strategy, learns and improvements after reading editorial on notebooks after the contests/virtual.

In addition, about once a week, I recommend you to make time to think about much difficult problem (e.g. R2800 in Codeforces) for couple of hours. If you could not reach the solution after thinking couple of hours, I recommend you to read editorial because you can learn a lot. Solving high-level problems may give you chance to gain over 100 rating in a single contest, but also can give you chance to solve easier problems faster.

oly
oly-programming
problem-solving
learning
practice
accretion
strategy
hmm
pdf
guide
reflection
advice
wire-guided
marginal
stylized-facts
speed
time
cost-benefit
tools
multi
sleuthin
review
comparison
puzzles
contest
aggregator
recommendations
objektbuch
time-use
growth
studying
🖥
👳
yoga
tho he has 3 times as many submissions as me. maybe he does a lot of virtual rounds?

some snippets from the PDF guide linked:

1400-1900:

To be rating 1900, skills as follows are needed:

- You know and can use major algorithms like these:

Brute force DP DFS BFS Dijkstra

Binary Indexed Tree nCr, nPr Mod inverse Bitmasks Binary Search

- You can code faster (For example, 5 minutes for R1100 problems, 10 minutes for

R1400 problems)

If you are not good at fast-coding and fast-debugging, you should solve AtCoder problems. Actually, and statistically, many Japanese are good at fast-coding relatively while not so good at solving difficult problems. I think that’s because of AtCoder.

I recommend to solve problem C and D in AtCoder Beginner Contest. On average, if you can solve problem C of AtCoder Beginner Contest within 10 minutes and problem D within 20 minutes, you are Div1 in FastCodingForces :)

...

Interestingly, typical problems are concentrated in Div2-only round problems. If you are not good at Div2-only round, it is likely that you are not good at using typical algorithms, especially 10 algorithms that are written above.

If you can use some typical problem but not good at solving more than R1500 in Codeforces, you should begin TopCoder. This type of practice is effective for people who are good at Div.2 only round but not good at Div.1+Div.2 combined or Div.1+Div.2 separated round.

Sometimes, especially in Div1+Div2 round, some problems need mathematical concepts or thinking. Since there are a lot of problems which uses them (and also light-implementation!) in TopCoder, you should solve TopCoder problems.

I recommend to solve Div1Easy of recent 100 SRMs. But some problems are really difficult, (e.g. even red-ranked coder could not solve) so before you solve, you should check how many percent of people did solve this problem. You can use https://competitiveprogramming.info/ to know some informations.

1900-2200:

To be rating 2200, skills as follows are needed:

- You know and can use 10 algorithms which I stated in pp.11 and segment trees

(including lazy propagations)

- You can solve problems very fast: For example, 5 mins for R1100, 10 mins for

R1500, 15 mins for R1800, 40 mins for R2000.

- You have decent skills for mathematical-thinking or considering problems

- Strong mental which can think about the solution more than 1 hours, and don’t give up even if you are below average in Div1 in the middle of the contest

This is only my way to practice, but I did many virtual contests when I was rating 2000. In this page, virtual contest does not mean “Virtual Participation” in Codeforces. It means choosing 4 or 5 problems which the difficulty is near your rating (For example, if you are rating 2000, choose R2000 problems in Codeforces) and solve them within 2 hours. You can use https://vjudge.net/. In this website, you can make virtual contests from problems on many online judges. (e.g. AtCoder, Codeforces, Hackerrank, Codechef, POJ, ...)

If you cannot solve problem within the virtual contests and could not be able to find the solution during the contest, you should read editorial. Google it. (e.g. If you want to know editorial of Codeforces Round #556 (Div. 1), search “Codeforces Round #556 editorial” in google) There is one more important thing to gain rating in Codeforces. To solve problem fast, you should equip some coding library (or template code). For example, I think that equipping segment tree libraries, lazy segment tree libraries, modint library, FFT library, geometry library, etc. is very effective.

2200 to 2400:

Rating 2200 and 2400 is actually very different ...

To be rating 2400, skills as follows are needed:

- You should have skills that stated in previous section (rating 2200)

- You should solve difficult problems which are only solved by less than 100 people in Div1 contests

...

At first, there are a lot of educational problems in AtCoder. I recommend you should solve problem E and F (especially 700-900 points problem in AtCoder) of AtCoder Regular Contest, especially ARC058-ARC090. Though old AtCoder Regular Contests are balanced for “considering” and “typical”, but sadly, AtCoder Grand Contest and recent AtCoder Regular Contest problems are actually too biased for considering I think, so I don’t recommend if your goal is gain rating in Codeforces. (Though if you want to gain rating more than 2600, you should solve problems from AtCoder Grand Contest)

For me, actually, after solving AtCoder Regular Contests, my average performance in CF virtual contest increased from 2100 to 2300 (I could not reach 2400 because start was early)

If you cannot solve problems, I recommend to give up and read editorial as follows:

Point value 600 700 800 900 1000-

CF rating R2000 R2200 R2400 R2600 R2800

Time to editorial 40 min 50 min 60 min 70 min 80 min

If you solve AtCoder educational problems, your skills of competitive programming will be increased. But there is one more problem. Without practical skills, you rating won’t increase. So, you should do 50+ virtual participations (especially Div.1) in Codeforces. In virtual participation, you can learn how to compete as a purple/orange-ranked coder (e.g. strategy) and how to use skills in Codeforces contests that you learned in AtCoder. I strongly recommend to read editorial of all problems except too difficult one (e.g. Less than 30 people solved in contest) after the virtual contest. I also recommend to write reflections about strategy, learns and improvements after reading editorial on notebooks after the contests/virtual.

In addition, about once a week, I recommend you to make time to think about much difficult problem (e.g. R2800 in Codeforces) for couple of hours. If you could not reach the solution after thinking couple of hours, I recommend you to read editorial because you can learn a lot. Solving high-level problems may give you chance to gain over 100 rating in a single contest, but also can give you chance to solve easier problems faster.

august 2019 by nhaliday

Task Archive - SZKOpuł

august 2019 by nhaliday

from POI: https://pinboard.in/u:nhaliday/b:598fa10ddfde

English translations for most problems are available in the old task archive interface

more on that: https://codeforces.com/blog/entry/60992

oly
oly-programming
puzzles
contest
quixotic
accretion
eastern-europe
usaco-ioi
unit
nostalgia
database
foreign-lang
anglo
language
multi
practice
English translations for most problems are available in the old task archive interface

more on that: https://codeforces.com/blog/entry/60992

august 2019 by nhaliday

The 'science' of training in competitive programming - Codeforces

august 2019 by nhaliday

"Hard problems" is subjective. A good rule of thumb for learning problem solving (at least according to me) is that your problem selection is good if you fail to solve roughly 50% of problems you attempt. Anything in [20%,80%] should still be fine, although many people have problems staying motivated if they fail too often. Read solutions for problems you fail to solve.

(There is some actual math behind this. Hopefully one day I'll have the time to write it down.)

- misof in a comment

--

I don't believe in any of things like "either you solve it in 30mins — few hours, or you never solve it at all". There are some magic at first glance algorithms like polynomial hashing, interval tree or FFT (which is magic even at tenth glance :P), but there are not many of them and vast majority of algorithms are possible to be invented on our own, for example dp. In high school I used to solve many problems from IMO and PMO and when I didn't solve a problem I tried it once again for some time. And I have solved some problems after third or sth like that attempt. Though, if we are restricting ourselves to beginners, I think that it still holds true, but it would be better to read solutions after some time, because there are so many other things which we can learn, so better not get stuck at one particular problem, when there are hundreds of other important concepts to be learnt.

oly
oly-programming
problem-solving
learning
practice
accretion
strategy
marginal
wire-guided
stylized-facts
hmm
advice
tactics
time
time-use
cost-benefit
growth
studying
🖥
👳
(There is some actual math behind this. Hopefully one day I'll have the time to write it down.)

- misof in a comment

--

I don't believe in any of things like "either you solve it in 30mins — few hours, or you never solve it at all". There are some magic at first glance algorithms like polynomial hashing, interval tree or FFT (which is magic even at tenth glance :P), but there are not many of them and vast majority of algorithms are possible to be invented on our own, for example dp. In high school I used to solve many problems from IMO and PMO and when I didn't solve a problem I tried it once again for some time. And I have solved some problems after third or sth like that attempt. Though, if we are restricting ourselves to beginners, I think that it still holds true, but it would be better to read solutions after some time, because there are so many other things which we can learn, so better not get stuck at one particular problem, when there are hundreds of other important concepts to be learnt.

august 2019 by nhaliday

Timus Online Judge

july 2019 by nhaliday

more extensive status page than most judges

oly-programming
oly
programming
puzzles
database
problem-solving
accretion
russia
contest
unit
practice
july 2019 by nhaliday

OSF | Near and Far Transfer in Cognitive Training: A Second-Order Meta- Analysis

february 2019 by nhaliday

In Models 1 (k = 99) and 2 (k = 119), we investigated the impact of working-memory training on near-transfer (i.e., memory) and far-transfer (e.g., reasoning, speed, and language) measures, respectively, and whether it is mediated by the type of population. Model 3 (k = 233) extended Model 2 by adding six meta-analyses assessing the far-transfer effects of other cognitive-training programs (video-games, music, chess, and exergames). Model 1 showed that working-memory training does induce near transfer, and that the size of this effect is moderated by the type of population. By contrast, Models 2 and 3 highlighted that far-transfer effects are small or null.

study
preprint
psychology
cog-psych
intelligence
generalization
dimensionality
psych-architecture
intervention
enhancement
practice
february 2019 by nhaliday

Deliberate Practice and Performance in Music, Games, Sports, Education, and Professions: A Meta-Analysis

december 2017 by nhaliday

We found that deliberate practice explained 26% of the variance in performance for games, 21% for music, 18% for sports, 4% for education, and less than 1% for professions. We conclude that deliberate practice is important, but not as important as has been argued.

pdf
study
psychology
cog-psych
social-psych
teaching
tutoring
learning
studying
stylized-facts
metabuch
career
long-term
music
games
sports
education
labor
data
list
expert-experience
ability-competence
roots
variance-components
top-n
meta-analysis
practice
quixotic
december 2017 by nhaliday

Overlearning hyperstabilizes a skill by making processing inhibitory-dominant | Hacker News

february 2017 by nhaliday

Usually, learning immediately after training is so unstable that it can be disrupted by subsequent new learning until after passive stabilization occurs hours later. However, overlearning so rapidly and strongly stabilizes the learning state that it not only becomes resilient against, but also disrupts, subsequent new learning. Such hyperstabilization is associated with an abrupt shift from glutamate-dominant excitatory to GABA-dominant inhibitory processing in early visual areas. Hyperstabilization contrasts with passive and slower stabilization, which is associated with a mere reduction of excitatory dominance to baseline levels. Using hyperstabilization may lead to efficient learning paradigms.

hn
commentary
study
org:nat
summary
psychology
cog-psych
learning
neurons
neuro
thinking
retention
practice
brain-scan
neuro-nitgrit
inhibition
mindful
knowledge
february 2017 by nhaliday

Highlighting a Waste of Time, Bryan Caplan | EconLog | Library of Economics and Liberty

december 2016 by nhaliday

Garett Jones' top catchphrase is, "If only there were a vast empirical literature on X." When you're well-aware of the vast empirical literature to which he's alluding, it's funny. Whenever you discover a new-to-you vast empirical literature, though, it's humbling. The world's packed with vast empirical literatures. Anytime you open your mouth in earnest, you're probably running afoul of one of them.

The Power of Distributed Practice: https://www.econlib.org/archives/2015/09/the_power_of_di.html

basically: spaced repetition works

spearhead
cracker-econ
org:econlib
aphorism
social-science
education
study
summary
psychology
econotariat
evidence-based
intervention
null-result
input-output
multi
studying
retention
distribution
time
sequential
practice
commentary
cost-benefit
notetaking
The Power of Distributed Practice: https://www.econlib.org/archives/2015/09/the_power_of_di.html

basically: spaced repetition works

december 2016 by nhaliday

Why Constant Learners All Embrace the 5-Hour Rule – The Mission – Medium

august 2016 by nhaliday

better than the title suggests, eg, Ben Franklins personal routine looks a lot like what I arrived at independently

growth
akrasia
advice
vulgar
habit
org:med
productivity
learning
creative
wire-guided
practice
time-use
studying
time
investing
august 2016 by nhaliday

soft question - How do you not forget old math? - MathOverflow

june 2016 by nhaliday

Terry Tao:

I find that blogging about material that I would otherwise forget eventually is extremely valuable in this regard. (I end up consulting my own blog posts on a regular basis.) EDIT: and now I remember I already wrote on this topic: terrytao.wordpress.com/career-advice/write-down-what-youve-done

fedja:

The only way to cope with this loss of memory I know is to do some reading on systematic basis. Of course, if you read one paper in algebraic geometry (or whatever else) a month (or even two months), you may not remember the exact content of all of them by the end of the year but, since all mathematicians in one field use pretty much the same tricks and draw from pretty much the same general knowledge, you'll keep the core things in your memory no matter what you read (provided it is not patented junk, of course) and this is about as much as you can hope for.

Relating abstract things to "real life stuff" (and vice versa) is automatic when you work as a mathematician. For me, the proof of the Chacon-Ornstein ergodic theorem is just a sandpile moving over a pit with the sand falling down after every shift. I often tell my students that every individual term in the sequence doesn't matter at all for the limit but somehow together they determine it like no individual human is of any real importance while together they keep this civilization running, etc. No special effort is needed here and, moreover, if the analogy is not natural but contrived, it'll not be helpful or memorable. The standard mnemonic techniques are pretty useless in math. IMHO (the famous "foil" rule for the multiplication of sums of two terms is inferior to the natural "pair each term in the first sum with each term in the second sum" and to the picture of a rectangle tiled with smaller rectangles, though, of course, the foil rule sounds way more sexy).

One thing that I don't think the other respondents have emphasized enough is that you should work on prioritizing what you choose to study and remember.

Timothy Chow:

As others have said, forgetting lots of stuff is inevitable. But there are ways you can mitigate the damage of this information loss. I find that a useful technique is to try to organize your knowledge hierarchically. Start by coming up with a big picture, and make sure you understand and remember that picture thoroughly. Then drill down to the next level of detail, and work on remembering that. For example, if I were trying to remember everything in a particular book, I might start by memorizing the table of contents, and then I'd work on remembering the theorem statements, and then finally the proofs. (Don't take this illustration too literally; it's better to come up with your own conceptual hierarchy than to slavishly follow the formal hierarchy of a published text. But I do think that a hierarchical approach is valuable.)

Organizing your knowledge like this helps you prioritize. You can then consciously decide that certain large swaths of knowledge are not worth your time at the moment, and just keep a "stub" in memory to remind you that that body of knowledge exists, should you ever need to dive into it. In areas of higher priority, you can plunge more deeply. By making sure you thoroughly internalize the top levels of the hierarchy, you reduce the risk of losing sight of entire areas of important knowledge. Generally it's less catastrophic to forget the details than to forget about a whole region of the big picture, because you can often revisit the details as long as you know what details you need to dig up. (This is fortunate since the details are the most memory-intensive.)

Having a hierarchy also helps you accrue new knowledge. Often when you encounter something new, you can relate it to something you already know, and file it in the same branch of your mental tree.

thinking
math
growth
advice
expert
q-n-a
🎓
long-term
tradeoffs
scholar
overflow
soft-question
gowers
mathtariat
ground-up
hi-order-bits
intuition
synthesis
visual-understanding
decision-making
scholar-pack
cartoons
lens
big-picture
ergodic
nibble
zooming
trees
fedja
reflection
retention
meta:research
wisdom
skeleton
practice
prioritizing
concrete
s:***
info-dynamics
knowledge
studying
the-trenches
chart
expert-experience
quixotic
elegance
heavyweights
I find that blogging about material that I would otherwise forget eventually is extremely valuable in this regard. (I end up consulting my own blog posts on a regular basis.) EDIT: and now I remember I already wrote on this topic: terrytao.wordpress.com/career-advice/write-down-what-youve-done

fedja:

The only way to cope with this loss of memory I know is to do some reading on systematic basis. Of course, if you read one paper in algebraic geometry (or whatever else) a month (or even two months), you may not remember the exact content of all of them by the end of the year but, since all mathematicians in one field use pretty much the same tricks and draw from pretty much the same general knowledge, you'll keep the core things in your memory no matter what you read (provided it is not patented junk, of course) and this is about as much as you can hope for.

Relating abstract things to "real life stuff" (and vice versa) is automatic when you work as a mathematician. For me, the proof of the Chacon-Ornstein ergodic theorem is just a sandpile moving over a pit with the sand falling down after every shift. I often tell my students that every individual term in the sequence doesn't matter at all for the limit but somehow together they determine it like no individual human is of any real importance while together they keep this civilization running, etc. No special effort is needed here and, moreover, if the analogy is not natural but contrived, it'll not be helpful or memorable. The standard mnemonic techniques are pretty useless in math. IMHO (the famous "foil" rule for the multiplication of sums of two terms is inferior to the natural "pair each term in the first sum with each term in the second sum" and to the picture of a rectangle tiled with smaller rectangles, though, of course, the foil rule sounds way more sexy).

One thing that I don't think the other respondents have emphasized enough is that you should work on prioritizing what you choose to study and remember.

Timothy Chow:

As others have said, forgetting lots of stuff is inevitable. But there are ways you can mitigate the damage of this information loss. I find that a useful technique is to try to organize your knowledge hierarchically. Start by coming up with a big picture, and make sure you understand and remember that picture thoroughly. Then drill down to the next level of detail, and work on remembering that. For example, if I were trying to remember everything in a particular book, I might start by memorizing the table of contents, and then I'd work on remembering the theorem statements, and then finally the proofs. (Don't take this illustration too literally; it's better to come up with your own conceptual hierarchy than to slavishly follow the formal hierarchy of a published text. But I do think that a hierarchical approach is valuable.)

Organizing your knowledge like this helps you prioritize. You can then consciously decide that certain large swaths of knowledge are not worth your time at the moment, and just keep a "stub" in memory to remind you that that body of knowledge exists, should you ever need to dive into it. In areas of higher priority, you can plunge more deeply. By making sure you thoroughly internalize the top levels of the hierarchy, you reduce the risk of losing sight of entire areas of important knowledge. Generally it's less catastrophic to forget the details than to forget about a whole region of the big picture, because you can often revisit the details as long as you know what details you need to dig up. (This is fortunate since the details are the most memory-intensive.)

Having a hierarchy also helps you accrue new knowledge. Often when you encounter something new, you can relate it to something you already know, and file it in the same branch of your mental tree.

june 2016 by nhaliday

Olimpiada Informatyczna

april 2016 by nhaliday

old link seems broken?: http://main.edu.pl/en/archive/oi

Polish Informatics Olympiad, known for very difficult problems

https://pinboard.in/u:nhaliday/b:a5a0461a843f

database
problem-solving
puzzles
eastern-europe
oly
usaco-ioi
oly-programming
unit
multi
quixotic
nostalgia
cost-benefit
advanced
contest
foreign-lang
practice
Polish Informatics Olympiad, known for very difficult problems

https://pinboard.in/u:nhaliday/b:a5a0461a843f

april 2016 by nhaliday

How to pass a programming interview - Triplebyte

march 2016 by nhaliday

Mostly intuitive (eg, I had also planned to interview in reverse order and use Python but mention C++ experience), but still very good advice. Summoning/faking enthusiasm will prob be hardest part for me.

programming
career
jobs
tech
recruiting
advice
checklists
working-stiff
interview-prep
system-design
minimum-viable
pls
jvm
python
c(pp)
practice
education
signaling
judgement
prioritizing
list
top-n
metabuch
objektbuch
🖥
transitions
techtariat
org:com
march 2016 by nhaliday

bundles : discipline ‧ growth ‧ ng

**related tags**

Copy this bookmark: