//Runtime: 16 ms
class Solution {
public:

    int f = 1;
    void TopSort(int src, int visited[],int greyset[], stack<int> &S, vector<int>adj[])
    {
        visited[src] = 1;
        greyset[src]= 1;

        for(auto it:adj[src])
        {
            if(!visited[it])
                TopSort(it, visited, greyset, S, adj);
            else
            {
                if(greyset[it])
                    f = 0;
            }
        }

        greyset[src] = 0;
        S.push(src);
    }

    vector<int> findOrder(int numCourses, vector<pair<int, int>>& prerequisites) {
        vector<int>adj[numCourses];

        vector<pair<int,int> > ::iterator it;
        for(it=prerequisites.begin();it!=prerequisites.end();it++)
            adj[it->second].push_back(it->first);

        stack<int>S;
        int visited[numCourses];
        memset(visited, 0, sizeof(visited));

        int greyset[numCourses];
        memset(greyset, 0, sizeof(greyset));

        for(int i=0;i<numCourses;i++)
            if(!visited[i])
                TopSort(i, visited, greyset, S, adj);

        vector<int> res;
        if(!f)
            return res;

        while(!S.empty())
        {
            res.push_back(S.top());
            S.pop();
        }

        return res;

    }
};