Cod sursa(job #1728293)

Utilizator benisBenis Mimimus benis Data 12 iulie 2016 18:03:55
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 250000
#define MMAX 300000

//#define _DEBUG

int N, M, PMax = 0;
int Q[MMAX];
int P[MMAX];

int stramosi[NMAX][NMAX+1];

int main(int argc, const char * argv[]) {
    int i, j;
    fstream fin("stramosi.in", fstream::in);
    fin >> N >> M;
    for (i = 1; i <= N; i++) {
        fin >> stramosi[i][1];
    }
    for (i = 0; i < M; i++) {
        fin >> Q[i] >> P[i];
        if (P[i] > PMax)
            PMax = P[i];
    }
    PMax = (PMax + N - 1) / N;
    if (PMax > 10)
        PMax = 10;
    for (j = 2; j <= PMax; j++) {
        for (i = 1; i <= N; i++) {
            int s = stramosi[i][j-1];
            if (s != 0)
                s = stramosi[s][1];
            stramosi[i][j] = s != 0 ? stramosi[s][1] : 0;
        }
    }
    
    for (i = 0; i < M; i++) {
        int p = P[i];
        int q = Q[i];
        while (p > PMax) {
            q = stramosi[q][PMax];
            p -= PMax;
        }
        stramosi[Q[i]][P[i]] = stramosi[q][p];
    }
    fin.close();
    
    
#ifdef _DEBUG
    for (int i = 0; i < M; i++)
        cout << stramosi[Q[i]][P[i]] << "\n";
#else
    fstream fout("stramosi.out", fstream::out);
    for (int i = 0; i < M; i++)
        fout << stramosi[Q[i]][P[i]] << "\n";
    fout.close();
#endif
    return 0;
}