Pagini recente » Cod sursa (job #694609) | Cod sursa (job #1069036) | Cod sursa (job #693711) | Cod sursa (job #1215351) | Cod sursa (job #770080)
Cod sursa(job #770080)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("stramosi.in");
ofstream g("stramosi.out");
#define nmax 250001
#define log_n 19
int stramos[log_n][nmax]; // tin pentru fiecare nod al 2^i-lea stramos; => adancimea maxima prima valoarea a lui i a.i. 2^i >= n => i = 18
int n, m;
string s;
int Poz;
void citeste_buf(int &nr){
nr = 0;
for(; s[Poz]<'0' || s[Poz]>'9'; Poz++);
for(; s[Poz]>='0' && s[Poz]<='9'; Poz++){
nr = nr * 10 + (s[Poz] - '0');
}
}
void citeste(){
s.clear();
Poz = 0;
getline(f,s);
citeste_buf(n);
citeste_buf(m);
s.clear();
Poz = 0;
getline(f,s);
for(int i=1; i<=n; i++){
int x;
citeste_buf(x);
stramos[0][i] = x;
}
}
int caut(int x){
int poz = -1;
while(x){
++poz;
x = x / 2;
}
return poz;
}
void rezolva(){
//fac matricea; a[2^i][nod] = X; => a[2^(i+1)][nod] = a[2^i][X];
for(int i=1; (1<<i)<=n; i++){
for(int j=1; j<=n; j++){
int X = stramos[i-1][j];
stramos[i][j] = stramos[i-1][X];
}
}
// al p-lea stramos al lui X il voi afla : fie i a.i. 2^i <= p => acum voi afla al p-(2^i) stramos al lui nod;(nod fiind stramos[2^i][X];
//practic pentru fiecare bit de 1 din reprezentarea binara a lui p voi tot lua stramosi
for(int i=1; i<=m; i++){
int p, x;
s.clear();
Poz = 0;
getline(f,s);
citeste_buf(x);
citeste_buf(p);
/*
while( p ){
//caut cel mai mare i a. i. 2^i <= p;
int poz = caut(p);
//cout << poz << '\n';
//iau al 2^i-lea stramos al nodului x
x = stramos[poz][x];
//i-au acum voi cauta al (p-(2^i))-lea stramos al noului nod x(care e al 2^ilea stramos al lui x)
p = p - (1<<poz);
}
g<< x<< "\n";
*/
for(int j=0; (1<<j) <= p; j++){
if ((p & (1<<j) ) != 0)
x = stramos[j][x];
}
g << x << "\n";
}
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}