Pagini recente » Cod sursa (job #1561337) | Cod sursa (job #1373185) | Cod sursa (job #1737303) | Cod sursa (job #1131799) | Cod sursa (job #162530)
Cod sursa(job #162530)
#include <stdio.h>
#include <math.h>
#define minim(a, b) ((a) < (b) ? (a) : (b)
int m[100002][20],a[100002],n,k,i,j,l,r,x,y,lg[100002];
void rmq(int m[100002][20], int a[100002], int n)
{
int i, j;
//initialize M for the intervals with length 1
for (i = 0; i < n; i++)
m[i][0] = a[i];
//compute values from smaller to bigger intervals
for (j = 1; 1 << j <= n; j++)
for (i = 0; i + (1 << j) - 1 < n; i++)
/* if (a[m[i][j - 1]] < a[m[i + (1 << (j - 1))][j - 1]])
m[i][j] = m[i][j - 1];
else
m[i][j] = m[i + (1 << (j - 1))][j - 1]; */
m[i][j]=minim(m[i][j - 1],m[i + (1 << (j - 1))][j - 1]));
}
int main()
{FILE *fin,*fout;
fin=fopen("rmq.in","r");
fout=fopen("rmq.out","w");
fscanf(fin,"%d %d",&n,&k);
for (i=0;i<n;i++)
fscanf(fin,"%d",&a[i]);
lg[1]=0;
for (i=2;i<=n;i++)
lg[i]=lg[i/2]+1;
rmq(m,a,n);
for (l=1;l<=k;l++)
{fscanf(fin,"%d %d",&x,&y);
x--;
y--;
r=lg[y-x+1];
//if (a[m[x][r]]<=a[m[y-(1<<r)+1][r]]) fprintf(fout,"%d\n",a[m[x][r]]);
// else fprintf(fout,"%d\n",a[m[y-(1<<r)+1][r]]);
fprintf(fout,"%d\n",minim(m[x][r],m[y - (1 << (r)) + 1][r])));
}
fclose(fin);
fclose(fout);
return 0;
}