Pagini recente » Cod sursa (job #244492) | Cod sursa (job #2365044) | Cod sursa (job #1110353) | Cod sursa (job #1682660) | Cod sursa (job #264472)
Cod sursa(job #264472)
#include <stdio.h>
#include <stdlib.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);\
}
int m[LMAX][LOGMAX],v[LMAX];
void formare(int n){
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];
}
int lg(int n){
int i, k[LMAX];
k[0]=1;
for(i=1;i<n;i++)
k[i]=k[(i+1)/2-1]+1;
return k[n-1];
}
int rmq(int p,int q,int n){
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(){
int p,q,n,k,i;
FILE *f,*g;
deschidere("rmq.in","rt",f);
fscanf(f,"%d",&n);
for(i=0;i<n;i++)
fscanf(f,"%d",&v[i]);
formare(n);
fscanf(f,"%d",&k);
deschidere("rmq.out","wt",g);
for(i=0;i<k;i++){
fscanf(f,"%d %d",&p,&q);
p--;q--;
fprintf(g,"%d\n",v[rmq(p,q,n)]);
}
fclose(f);fclose(g);
return 0;
}