Cod sursa(job #2615283)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 14 mai 2020 00:00:56
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
//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();
}*/