Pagini recente » Cod sursa (job #1659134) | Cod sursa (job #1095872) | Cod sursa (job #2096346) | Cod sursa (job #543667) | Cod sursa (job #140706)
Cod sursa(job #140706)
# include <stdio.h>
# include <math.h>
# define IN "stramosi.in"
# define OUT "stramosi.out"
# define MAXLINE 20
# define MAXCOL 350000
int N,M;
void gaseste(FILE*,int,int);
void solve();
int mat[MAXLINE][MAXCOL];
int parinte(int,int);
int main(){
solve();
return 0;
}
void solve(){
FILE *in=fopen(IN,"rt");
FILE *out=fopen(OUT,"wt");
fscanf(in,"%d %d",&N,&M);
register int i,j;
for (i=0;i<log(N)+1;i++)
for (j=1;j<=N;j++)
mat[i][j]=-1;
int P,Q;
for (i=1;i<=N;i++)
fscanf(in,"%d",&mat[0][i]);
mat[0][0]=0;
for (i=0;i<N;i++)
if(mat[0][i]==0){
for (j=0;j<log(N)+1;j++)
mat[j][i]=0;
}
for (i=0;i<M;i++){
fscanf(in,"%d %d",&Q,&P);
gaseste(out,P,Q);
}
fclose(out);
fclose(in);
}
void gaseste(FILE* out,int P,int Q){
//omul are id-ul Q
//vreau al P-lea parinte
int i;
//putem avea maxim 2^18 parinti,aproximez la 2^20
int p=Q;
for (i=20;i>=0;i--)
if(P & (1 << i ) ){
p=parinte(p,i);//afla cel de-al 2^i-lea parinte al lui p
}
fprintf(out,"%d\n",p);
}
int parinte(int p,int i){
//afla cel de-al 2^i-lea parinte al lui p
//cu alte cuvinte afla care este valoarea lui mat[i][p]
if(i==0||mat[i][p]!=-1)
return mat[i][p];
else {
mat[i][p]=parinte(parinte(p,i-1),i-1);
return mat[i][p];
}
return 0;
}