Upsolver is a tool designed specifically for competitive programmers and team coaches, aimed at optimizing the upsolving process and streamlining team progress management.
-
Contestant: user who wants to learn by upsolving problems and receive help from his coach in form of hints.
-
Coach: user who Manages and guides competitive programming teams and provides hints to problems.
-
Diego is a 20-year-old Mexican man who is currently in his sophomore year of computer science. A year ago, he entered the world of competitive programming to learn more and be more attractive to companies that hire interns. Feeling frustrated with his progress, Diego sought the help of more experienced competitors and they told him that in order to improve he must do upsolving, which is when you try to solve the problems that you couldn’t solve during a contest, they also told him that he must do the upsolving with his team and not alone, as this will make it easier for him to be consistent. Diego appreciates the advice of his friends, but the idea of doing upsolving seems overwhelming. He has too many pending contests to upsolve, and it seems to him that doing so is an impossible task. Also, he gets a lot of anxiety asking his teammates about their progress with upsolving.
-
Alexia is a 19-year-old student from Mexico who is currently studying her first year of engineering in data science and mathematics. She has a lot of experience in math competitions and upon entering university she was drawn to her to also participate in programming competitions, so she joined a team from her university. Her team is quite big, it has three competitors, a substitute, a coach and two co-coaches. To upsolve, Alexia's team currently uses a shared Excel file where everyone records their progress, and to ask for help when she's stuck with a problem, she does it via direct message to her coaches and teammates, because if she does it in a group chat everyone would get spoiled with the answer. Alexia is fine with the current system, but when there is a new contest and it is her turn to add it to the Excel file, it takes her a long time to capture the information of the problems. In addition, she feels that sometimes her trainers answer her questions with some annoyance, since they are questions that they have already answered for other people as well.
-
Leonardo is a 23-year-old Mexican man who is currently about to graduate from a computer science degree. During his time at the university, he competed in the ICPC, qualifying for two world finals and is currently the coach of several teams in Mexico. Leonardo likes to help his apprentices by answering their questions, but his job doesn’t give him much time to do so. Also, Leonardo is sometimes puzzled by not knowing the progress the teams he coaches are making and whether the time he is investing in them is helping them to improve.
-
Sofia is a 24-year-old Mexican woman who just graduated and is currently working full time at Oracle MDC. A couple of months ago, an ICPC team from her old university contacted her to ask her to be her coach and she accepted. When talking with her new team, Sofía realized that they don’t do upsolving, so she plans to recommend that they do so she is looking for strategies to make it easier for them to start doing it.
- As a competitor, I want to be able to create an account, so that I can access my team's information.
- As a competitor, I want to quickly add a contest to my list of pending upsolving contests, so that I can spend less time on organization and more on actual upsolving.
- As a competitor, I want to quickly access the problem I choose to start upsolving, so that I don't have to search for problem statements in different places and save time.
- As a competitor, I want to quickly record my progress, to make the process less cumbersome.
- As a competitor, I want to clearly see the progress I have made, to avoid feeling overwhelmed by the number of pending problems for upsolving.
- As a competitor, I want to see the progress of other team members and compare my progress with theirs, to stay motivated in my upsolving journey.
- As a competitor, I want to view a list of problems I have upsolved categorized by topics and with my notes, so that I can share examples of problems from a specific topic when I teach at my programming club.
- As a competitor, for a specific problem, I want to request hints from my coach and see the hints they have already given to other team members, to unblock myself and continue progressing in upsolving.
- As a coach, I want to create an account, to access the information of the teams I coach.
- As a coach, I want to view the progress of the teams I coach, to ensure that my assistance is benefiting them and to stay motivated to help them.
- As a coach, I want to provide hints to my learners when they ask for them, so that they can overcome challenges and continue with their training.
- As a coach, I want to see a summary of my teams' weekly progress, to evaluate their performance and consider it for future contest assignments.
The application will have the following screens:
- Teams
- Contest Groups
- Contest Group Problem's Table
- Team's Information
- Problemset
Tentatively, the two technical challenges of this project will be:
- to integrate a web scratcher into the application to populate the contest group tables quickly, and
- to make the discussion chats work in real time.
It is also proposed as a possible third technical challenge to add push notifications.
| HTTP Verb |
API Endpoint |
Action |
| POST |
/users |
Create a new user in the database with the provided information. |
| GET |
/users/{id} |
Retrieve the details of a specific user based on the provided user ID. |
| PUT |
/users/{id} |
Update the details of a specific user based on the provided user ID. |
| DELETE |
/users/{id} |
Delete a specific user based on the provided user ID. |

| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
Unique identifier for each user |
| UK1 |
username |
varchar |
Unique username chosen by the user |
| UK2 |
email |
varchar |
Unique email address of the user |
|
password |
varchar |
Encrypted password for the user's account |
|
name |
varchar |
Full name of the user |
|
creation_date |
date |
Date when the user's account was created |
| Key |
Column Name |
Data Type |
Description |
| PK,FK1 |
user_id |
int |
The primary key and foreign key referencing the User table |
| PK,FK2 |
team_id |
int |
The primary key and foreign key referencing the Team table |
|
name |
varchar |
The name of the role |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the team |
|
name |
varchar |
The name of the team |
|
creation_date |
date |
The date the team was created |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the group |
| FK |
team_id |
int |
The foreign key referencing the Team table |
|
url |
varchar |
The URL of the group |
|
name |
varchar |
The name of the group |
|
creation_date |
date |
The date the group was created |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the division |
| FK |
group_id |
int |
The foreign key referencing the Group table |
|
name |
varchar |
The name of the division |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the contest |
| FK |
division_id |
int |
The foreign key referencing the Division table |
|
url |
varchar |
The URL of the contest |
|
name |
varchar |
The name of the contest |
|
start_date |
date |
The start date of the contest |
| Key |
Column Name |
Data Type |
Description |
| PK,FK1 |
team_id |
int |
The primary key and foreign key referencing the Team table |
| PK,FK2 |
problem_id |
int |
The primary key and foreign key referencing the Problem table |
|
tbd |
tbd |
To be determined |
| Key |
Column Name |
Data Type |
Description |
| PK,FK1 |
contest_id |
int |
The primary key and foreign key referencing the Contest table |
| PK,FK2 |
problem_id |
int |
The primary key and foreign key referencing the Problem table |
|
url |
varchar |
The URL of the problem |
|
index |
varchar |
The index of the problem |
|
solved |
int |
Number of competitors who solved the problem during the contest |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the problem |
|
url |
varchar |
The URL of the problem |
|
name |
varchar |
The name of the problem |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the tag |
| FK |
user_id |
int |
The foreign key referencing the User table |
| FK |
problem_id |
int |
The foreign key referencing the Problem table |
|
name |
varchar |
The name of the tag |
| Key |
Column Name |
Data Type |
Description |
| PK |
id |
int |
The primary key of the submission |
| FK |
user_id |
int |
The foreign key referencing the User table |
| FK |
problem_id |
int |
The foreign key referencing the Problem table |
|
veredict |
varchar |
The verdict of the submission |
|
creation_date |
date |
The date the submission was created |