Pagini recente » Cod sursa (job #2087467) | Cod sursa (job #2816916) | Cod sursa (job #2547554) | Cod sursa (job #2896864) | Cod sursa (job #1492165)
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#define MAX_N 500000
#define INF 30001
char *in_buff;//unallocated
char *buff;
int fSize;
int fileSize(FILE *f)
{
struct stat s;
unsigned int fd = fileno(f);
fstat(fd,&s);
return s.st_size;
}
int comp(const void* a, const void* b)
{
int _a=*((int*)a);
int _b=*((int*)b);
if(_a>_b)
return 1;
else if(_a<_b)
return -1;
else return 0;
}
int deque[MAX_N],prim,ultim;
int v [MAX_N],v_prim;
int bases[MAX_N];
int main()
{
FILE *fin=fopen("secventa.in","rb");//read to buffer
fSize=fileSize(fin);
in_buff=(char*)malloc(fSize);
fread(in_buff,sizeof(char),fSize,fin);
fclose(fin);//buffer fullfied
int n,k;
int i;
int x;
int len;
buff=in_buff;
sscanf(buff,"%d %d %n",&n,&k,&len);
buff+=len;
//algoritm: Aplic maxim in fereastra glisanta doar ca cu minime
//1. pun in deque primele k numere si le sortez
prim=0;
ultim=0;
for(i=0; i<k; i++)
{
sscanf(buff,"%d %n",&v[i],&len);
buff+=len;
if(deque[ultim-1]>v[i])
{
while(deque[ultim-1]>v[i]&&prim!=ultim)
deque[ultim-1]=0,ultim--;
}
deque[ultim]=v[i];
ultim++;
}
//2. deplasez fereastra
for(i=k, v_prim=0; i<=n; i++, v_prim++)
{
sscanf(buff,"%d %n",&v[i], &len);
buff+=len;
//3. Daca elementul care e scos e minimul
if(deque[prim]==v[v_prim])
{
bases[v_prim]=deque[prim];//salvez "baza" subsecventei
prim++;//il scot din deque
}
else bases[v_prim]=deque[prim];//salvez "baza" subsecventei
//4. Scot din coada toate elementele mai mari decat "noul venit" si il asez
if(deque[ultim-1]>v[i])
{
while(deque[ultim-1]>v[i]&&prim!=ultim)
deque[ultim-1]=0,ultim--;
}
deque[ultim]=v[i];//5. il adaug la coada pe "noul venit"
ultim++;
}
//rezultat
int posStart,posStop,base;
base=-INF;
for(i=0;i<n-k+1;i++)
{
if(base<bases[i])
{
base=bases[i];
posStart=i+1;
posStop =i+k;
}
}
free(in_buff);
FILE *fout=fopen("secventa.out","w");
fprintf(fout,"%d %d %d",posStart,posStop,base);
fclose (fout);
return 0;
}