Pagini recente » Cod sursa (job #2773873) | Cod sursa (job #2988316) | Cod sursa (job #2276342) | Cod sursa (job #1766756) | Cod sursa (job #2615283)
//Stramosi
#include<bits/stdc++.h>
#define N 250010
#define LG 18
using namespace std;
int n,dp[N][LG+1],q;
int main()
{
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
fin>>n>>q;
for(int i=1;i<=n;++i)
fin>>dp[i][0];
for(int i=1;i<=n;++i)
for(int j=1;j<=LG;++j)
dp[i][j]=dp[dp[i][j-1]][j-1];
while(q--)
{
int d,p;
fin>>d>>p;
for(int i=LG;i>=0;--i)
if(p & (1<<i))
d=dp[d][i];
fout<<d<<'\n';
}
fin.close();
fout.close();
}
//Pikachu
/*#include<bits/stdc++.h>
#define med(k) (k&1 ? k/2 : k/2-1)
using namespace std;
int n,k;
vector<int> a,aj; //ma folosesc de el ca sa aflu costul in timp liniar
long long ans;
int main()
{
ifstream fin("pikachu.in");
fin>>n>>k;
a.reserve(n);
for(int i=0;i<n;++i)
fin>>a[i];
fin.close();
set<int> s;
for(int i=0;i<k;++i){
s.insert(a[i]);
aj.push_back(a[i]);
}
nth_element(aj.begin(),aj.begin()+(med(k)),aj.end());
int mij=aj[med(k)];
long long sum=0;
//cout<<aj[1];
for(int i=0;i<med(k);++i)
sum+=abs(aj[i]-mij);
for(int i=med(k)+1;i<k;++i)
sum+=abs(aj[i]-mij);
ans=sum;
//cout<<sum;
for(int i=k;i<n;++i)
{
set<int>::iterator it=s.find(mij);
int m=*(--it);
++it;
int M=*(++it);
int mijb=mij;
//cout<<sum<<' ';
s.erase(a[i-k]);
s.insert(a[i]);
if (a[i-k]==mij){
if (a[i]>=m && a[i]<=M) mij=a[i];
if (a[i]<m) mij=m;
if(a[i]>M) mij=M;
}
if (a[i-k]==m){
if (a[i]<mij) ;
else
if (a[i]>=mij && a[i]<=M) mij=a[i];
else mij=M;
}
if (a[i-k]==M){
if (a[i]>=m && a[i]<=mij) mij=a[i];
else
if (a[i]<m) mij=m;
}
if (a[i-k]<m)
if (a[i]>M) mij=M;
else if (a[i]>mij) mij=a[i];
if (a[i-k]>M){
if(a[i]>mij);
if (a[i]<m) mij=m;
else if (a[i]<mij) mij=a[i];
}
sum-=fabs(mijb-a[i-k]);
sum+=fabs(mij-a[i]);
if(k%2==0)
{ //cout<<"45";
sum+=mijb-mij;
}
//pentru k par dif dintre mij si mijb e la fel, iar diferentele aparente dintre restul
//sunt opuse 2 cate 2
ans=min(ans,sum);
}
ofstream fout("pikachu.out");
fout<<ans;
fout.close();
}*/