Pagini recente » Cod sursa (job #2830838) | Cod sursa (job #728080) | Cod sursa (job #1648256) | Cod sursa (job #3164545) | Cod sursa (job #264618)
Cod sursa(job #264618)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define LMAX 100000
#define LOGMAX 5
#define deschidere(cale,mod,flux)\
if((flux=fopen(cale,mod))==NULL){\
printf("\nNu se poate deschode %s.\n",cale);\
exit(1);\
}
long int m[LMAX][LOGMAX],v[LMAX];
void formare(long int n){
long int i,j;
for(i=0;i<n;i++) m[i][0]=i;
for(j=1;(1<<j)<=n;j++)
if(v[m[i][j-1]]<v[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];
}
long int lg(long int n){
int i=0;
while(pow(10,i)<=n) i++;
return i;
}
long int rmq(long int p,long int q,long int n){
long int k=lg(n);
if(v[m[p][k]]<=v[m[q-(1<<k)+1][k]])
return m[p][k];
else return m[q-(1<<k)+1][k];
}
int main(){
long int p,q,n,k,i;
FILE *f,*g;
deschidere("rmq.in","rt",f);
fscanf(f,"%ld",&n);
for(i=0;i<n;i++)
fscanf(f,"%ld",&v[i]);
formare(n);
fscanf(f,"%ld",&k);
deschidere("rmq.out","wt",g);
for(i=0;i<k;i++){
fscanf(f,"%ld %ld",&p,&q);
p--;q--;
fprintf(g,"%ld\n",v[rmq(p,q,n)]);
}
fclose(f);fclose(g);
return 0;
}