Cod sursa(job #1492208)

Utilizator alexge50alexX AleX alexge50 Data 27 septembrie 2015 12:49:17
Problema Secventa Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#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++;

    }

    int posStart,posStop,base;

    base=deque[prim];
    posStart=1;
    posStop =k;

    //2. deplasez fereastra
    for(i=k, v_prim=0; i<=n; i++, v_prim++)
    {
        sscanf(buff,"%d %n",&v[i], &len);
        buff+=len;

        if(deque[prim]>base)
        {
            base=deque[prim];
            posStart=v_prim+1;
            posStop =v_prim+k;
        }

        //3. Daca elementul care e scos e minimul
        if(deque[prim]==v[v_prim])
        {
            prim++;//il scot din deque
        }

        //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++;
    }

    free(in_buff);
    FILE *fout=fopen("secventa.out","w");
    fprintf(fout,"%d %d %d",posStart,posStop,base);
    fclose (fout);

    return 0;
}