Pagini recente » Cod sursa (job #1312552) | Cod sursa (job #3126749) | Cod sursa (job #3276983) | Cod sursa (job #236398) | Cod sursa (job #65267)
Cod sursa(job #65267)
#include <stdio.h>
#include <math.h>
long int n,m,p[101][40];
long int xx[301],dh;
void constr_heap();
void recon_heap();
int putere_2(long int x)
{
long int p=1;
long int k=0;
if (x==1)
return 0;
do
{
p*=2;
k++;
}
while (p<x);
return --k;
}
void recon_heap(int a[101],int i)
{
int l=2*i,r;
r=l+1;
int max;
if ((l<=dh)&&(a[l]>a[i]))
max=l;
else
max=i;
if ((r<=dh)&&(a[r]>a[max]))
max=r;
if (max!=i)
{
a[0]=a[i];
a[i]=a[max];
a[max]=a[0];
recon_heap(a,max);
}
}
void constr_heap(int a[101])
{
dh=n;
int i;
for (i=n/2;i>=1;i--)
recon_heap(a,i);
}
void heapsort(int a[101])
{
int i;
for (i=n;i>=2;i--)
{
a[0]=a[i];
a[i]=a[1];
a[1]=a[0];
dh--;
recon_heap(a,1);
}
}
int main()
{
freopen ("stramosi.in","r",stdin);
freopen ("stramosi.out","w",stdout);
scanf ("%ld %ld",&n,&m);
register long i;
long int kk=0;
int a[101];
for (i=1;i<=n;i++)
{
scanf ("%ld",&a[i]);
}
constr_heap(a);
heapsort(a);
for (i=1;i<=n;i++)
{
p[i][0]=a[i];
if (a[i]==0)
xx[++kk]=i;
// printf("%ld ",p[i][0]);
/* if (h==0)
p[i][0]=h;*/
register long int j;
if (a[i]!=0)
for (j=1;p[p[i][j-1]][j-1]!=0;j++)
{
p[i][j]=p[p[i][j-1]][j-1];
// printf("%ld ",p[i][j]);
}
// printf("\n");
}
for (i=1;i<=kk;i++)
{
p[xx[i]][0]=xx[i];
// printf("%ld ",xx[i]);
}
long q,l;
// printf("\n\n");
for (i=1;i<=m;i++)
{
scanf("%ld %ld",&q,&l);
/* if (q==q)
{*/
p[0][0]=putere_2(l);
l-=pow(2,p[0][0]);
//}
while ((p[q][p[0][0]]!=0)&&(l!=0)&&(p[q][p[0][0]]!=q))
{
q=p[q][p[0][0]];
p[0][0]=putere_2(l);
l-=pow(2,p[0][0]);
}
printf("%ld\n",p[q][p[0][0]]);
}
fclose(stdout);
return 0;
}