Pagini recente » Cod sursa (job #2185697) | Cod sursa (job #2267837) | Cod sursa (job #2595642) | Cod sursa (job #2928271) | Cod sursa (job #1733086)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#include<map>
#define DX 250100
using namespace std;
fstream fin("stramosi.in",ios::in),fout("stramosi.out",ios::out);
int inainte[DX+5],stra[DX+5][22],put[22],mp[DX+5];
vector<int> v[DX];
struct str{int a,c;};
queue <str> qu;
char s[1700000];
int search(int nod,int numar)
{
while(numar!=0 && nod!=0)
{
nod=stra[nod][mp[inainte[numar]]];
numar-=inainte[numar];
}
return nod;
}
void build(int nod,int nr)
{
int i,r;
qu.push({nod,nr});
while(!qu.empty())
{
nod=qu.front().a;
nr=qu.front().c;
qu.pop();
for(i=1;put[i]<=nr;i++)
{
stra[nod][i]=stra[stra[nod][i-1]][i-1];
}
for(auto x: v[nod]) qu.push({x,nr+1});
}
}
int main()
{
ios_base::sync_with_stdio(0);
int a,b,n,m,aux,stop,i,j=1,ind,siz;
fin>>n>>m;
fin.get();
fin.getline(s,1699999);
siz=strlen(s);
for(ind=1,i=0;ind<=n;i++)
{
if('0'<=s[i] && s[i]<='9')
{
aux=0;
for( ;'0'<=s[i] && s[i]<='9' && i<siz;i++) aux=aux*10+(s[i]-'0');
stra[ind][0]=aux;
v[stra[ind][0]].push_back(ind);
ind++;
}
}
for(i=0;i<19;i++)
{
aux=(1<<i);
stop=(1<<(1+i));
put[i]=aux;
mp[aux]=i;
for(j=aux;j<stop && j<DX;j++) inainte[j]=aux;
}
for(i=1;i<=n;i++) if(stra[i][0]==0) build(i,0);
for(i=1;i<=m;i++)
{
fin>>a>>b;
fout<<search(a,b)<<"\n";
}
}