Cod sursa(job #2009010)

Utilizator infomaxInfomax infomax Data 8 august 2017 13:23:24
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <bits/stdc++.h>

#define f first
#define s second

using namespace std;

ifstream F("stramosi.in");
ofstream G("stramosi.out");

int n, m, x, y, t[250005], l[250005], ans[300005], lng, stc[250005], k;
vector<int> w[250005];
vector<pair<int, int> > a[300005];
stack<int> st;
bitset<250005> v;

int main()
{
    F >> n >> m;
    for(int i = 1; i <= n; ++ i) F >> t[i], w[t[i]].push_back(i);
    for(int i = 1; i <= m; ++ i)
    {
        F >> x >> y;
        a[x].push_back({y, i});
    }
    vector<pair<int, int> > :: iterator it;
    for(int i = 1; i <= n; ++ i)
    {
        if(!v[i])
        {
            stc[++ k] = i;
            st.push(i);
            while(!st.empty())
            {
                x = st.top();
                v[x] = 1;
                lng = w[x].size();
                while(l[x] < lng)
                {
                    if(!v[w[x][l[x]]])
                    {
                        st.push(w[x][l[x]]);
                        stc[++ k] = w[x][l[x]];
                        break;
                    }
                    l[x] ++;
                }
                if(l[x] == lng)
                {
                    for(it = a[x].begin(); it != a[x].end(); ++ it)
                        if(k - (*it).f > 0)
                            ans[(*it).s] = stc[k - (*it).f];
                        else ans[(*it).s] = 0;
                    st.pop(); -- k;
                }
            }
        }
    }
    for(int i = 1; i <= m; ++ i) G << ans[i] << '\n';
    return 0;
}