Cod sursa(job #1729536)

Utilizator benisBenis Mimimus benis Data 15 iulie 2016 00:48:20
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <iostream>
#include <fstream>

using namespace std;

#define NMAX 250000
#define MMAX 300000
#define PMAX 18
//#define _DEBUG

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

int stramosi[NMAX+1][PMAX+1];

inline int readInt(string& s, int& index) {
    int i = 0;
    while (index < s.length()) {
        int ch = s[index];
        if (ch != ' ')
            break;
        index++;
    }
    while (index < s.length()) {
        int ch = s[index++];
        if (ch >= '0' && ch <= '9')
            i = i * 10 + ch - '0';
        else
            break;
    }
    return i;
}

int main(int argc, const char * argv[]) {
    int i, j;
    ifstream fin("stramosi.in", ios::in);
    string line;
    int index = 0;
    getline(fin, line);
    N = readInt(line, index);
    M = readInt(line, index);

    getline(fin, line);
    index = 0;
    for (i = 1; i <= N; i++)
        stramosi[i][0] = readInt(line, index);

    for (i = 0; i < M; i++) {
        getline(fin, line);
        index = 0;
        Q[i] = readInt(line, index);
        P[i] = readInt(line, index);
        if (P[i] > PMax)
            PMax = P[i];
    }
    fin.close();

    for (i = 1, j = 0; i < PMax; i <<= 1, j++);
    PMax = j - 1;
    if (PMax > PMAX)
        PMax = PMAX;
    for (j = 1; j <= PMax; j++) {
        for (i = 1; i <= N; i++) {
            int s = stramosi[i][j-1];
            if (s != 0)
                s = stramosi[s][j-1];
            stramosi[i][j] = s;
        }
    }
    
    for (i = 0; i < M; i++) {
        int p = P[i];
        int q = Q[i];
        for (int k = PMax; k >= 0 && p != 0 && q != 0; k--) {
            int bit = 1 << k;
            if ((p & bit) != 0) {
                q = stramosi[q][k];
                p &= ~bit;
            }
        }
        R[i] = q;
    }
    
    
#ifdef _DEBUG
    for (int i = 0; i < M; i++)
        cout << R[i] << "\n";
#else
    fstream fout("stramosi.out", fstream::out);
    for (int i = 0; i < M; i++)
        fout << R[i] << "\n";
    fout.close();
#endif
    return 0;
}