
#include <iostream>
#include <string>
#include <limits>
using namespace std;

bool readInt(const string& msg, int& x) {
    while (true) {
        cout << msg;
        if (cin >> x) return true;
        if (cin.eof()) return false;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Phai nhap so nguyen!\n";
    }
}
bool readDouble(const string& msg, double& x) {
    while (true) {
        cout << msg;
        if (cin >> x) return true;
        if (cin.eof()) return false;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Phai nhap so!\n";
    }
}
string readLine(const string& msg) {
    cout << msg;
    string s;
    getline(cin >> ws, s);
    return s;
}

struct Course { int id; string name; int maxStudents,registered; };
Course* findCourse(Course* ds,int n,int id){
    for(int i=0;i<n;++i)if(ds[i].id==id)return &ds[i];
    return nullptr;
}
void input(Course* ds,int n){
    for(int i=0;i<n;++i){
        cout<<"\nKhoa hoc "<<i+1<<":\n";
        while(true){if(!readInt("ID: ",ds[i].id))return;
            if(findCourse(ds,i,ds[i].id)==nullptr)break;
            cout<<"ID trung!\n";}
        ds[i].name=readLine("Ten khoa hoc: ");
        do{if(!readInt("Suc chua: ",ds[i].maxStudents))return;
            if(ds[i].maxStudents<0)cout<<"Khong duoc am!\n";
        }while(ds[i].maxStudents<0);
        do{if(!readInt("Da dang ky: ",ds[i].registered))return;
            if(ds[i].registered<0||ds[i].registered>ds[i].maxStudents)
                cout<<"Can 0 <= registered <= maxStudents!\n";
        }while(ds[i].registered<0||ds[i].registered>ds[i].maxStudents);
    }
}
void show(Course* ds,int n){
    for(int i=0;i<n;++i)cout<<ds[i].id<<" | "<<ds[i].name
        <<" | "<<ds[i].registered<<"/"<<ds[i].maxStudents<<'\n';
}
void search(Course* ds,int n){
    int id;if(!readInt("ID can tim: ",id))return;
    Course* p=findCourse(ds,n,id);
    if(!p){cout<<"Khong tim thay!\n";return;}
    cout<<p->id<<" | "<<p->name<<" | "<<p->registered<<"/"<<p->maxStudents<<'\n';
}
void registerCourse(Course* ds,int n){
    int id;if(!readInt("ID dang ky: ",id))return;
    Course* p=findCourse(ds,n,id);
    if(!p){cout<<"Khong tim thay!\n";return;}
    if(p->registered>=p->maxStudents){cout<<"Da day!\n";return;}
    ++p->registered;cout<<"Dang ky thanh cong!\n";
}
void cancelCourse(Course* ds,int n){
    int id;if(!readInt("ID huy dang ky: ",id))return;
    Course* p=findCourse(ds,n,id);
    if(!p){cout<<"Khong tim thay!\n";return;}
    if(p->registered<=0){cout<<"Chua co dang ky de huy!\n";return;}
    --p->registered;cout<<"Huy thanh cong!\n";
}
void changeCapacity(Course* ds,int n,bool isTeacher){
    if(!isTeacher){cout<<"Student khong duoc sua maxStudents!\n";return;}
    int id;if(!readInt("ID khoa hoc: ",id))return;
    Course* p=findCourse(ds,n,id);
    if(!p){cout<<"Khong tim thay!\n";return;}
    int capacity;if(!readInt("Suc chua moi: ",capacity))return;
    if(capacity<p->registered){cout<<"Khong duoc nho hon so da dang ky!\n";return;}
    p->maxStudents=capacity;cout<<"Da cap nhat!\n";
}
bool login(bool& isTeacher){
    int role;if(!readInt("1.Teacher 2.Student: ",role))return false;
    if(role==2){isTeacher=false;return true;}
    if(role==1){string pass=readLine("Mat khau teacher: ");
        if(pass=="T123"){isTeacher=true;return true;}}
    cout<<"Dang nhap that bai!\n";return false;
}
int main(){
    int n;if(!readInt("Nhap n (1..1000): ",n)||n<1||n>1000)return 0;
    Course* ds=new Course[n];input(ds,n);
    int mainChoice=-1;
    do{
        if(!readInt("\n1.Dang nhap 0.Thoat: ",mainChoice))break;
        if(mainChoice==1){bool isTeacher=false;
            if(!login(isTeacher))continue;
            int choice=-1;
            do{
                if(!readInt("\n1.Hien thi 2.Tim 3.Dang ky 4.Huy dang ky 5.Sua suc chua 0.Dang xuat: ",choice))break;
                switch(choice){
                    case 1:show(ds,n);break;
                    case 2:search(ds,n);break;
                    case 3:registerCourse(ds,n);break;
                    case 4:cancelCourse(ds,n);break;
                    case 5:changeCapacity(ds,n,isTeacher);break;
                    case 0:break;
                    default:cout<<"Lua chon sai!\n";
                }
            }while(choice!=0&&!cin.eof());
        }else if(mainChoice!=0)cout<<"Lua chon sai!\n";
    }while(mainChoice!=0&&!cin.eof());
    delete[] ds;ds=nullptr;return 0;
}

