Cod sursa(job #1473925)

Utilizator dnprxDan Pracsiu dnprx Data 20 august 2015 15:03:39
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>
#define Dim 500005

using namespace std;

int q[Dim];
long ind[Dim];
int n, k;
int a[Dim];
char buffer[6*Dim];

void Citire()
{
    freopen("secventa.in", "r", stdin);
    scanf("%d %d\n", &n, &k);
    fgets(buffer, sizeof(buffer), stdin);
    int ind = 1, sign = 1, sizebf = strlen(buffer);
    for(int i = 0; i < sizebf; ++i){
        if(buffer[i]=='-') sign = -1;
        else if(buffer[i] >= '0' && buffer[i] <= '9')
            a[ind]= a[ind]*10 + (buffer[i]-'0');
            else a[ind++]*=sign, sign = 1;
    }
}

int main()
{
 int x, maxim, poz, pr, ul, i, p ;
 Citire();
 // calculez minimul din primele k:
 pr = 0 ; ul = -1 ;
 for (i=1; i<=k; i++)
  {
   x = a[i];
   while ((pr<=ul)&&(q[ul] >= x)) ul-- ;
   q[++ul] = x ;
   ind[ul] = i ;
  }
 maxim = q[pr] ;
 poz = 1 ;
 p = 1;
 // calculez restul:
 for ( ; i<=n; i++)
  {
   x = a[i];
   while ((q[ul] >= x) && (pr<=ul)) ul-- ;
   q[++ul] = x ;
   ind[ul] = i ;
   p++ ;
   if (ind[pr] <= i-k) pr++ ;
   if (maxim < q[pr]) { maxim = q[pr] ;poz = p; }
  }
  freopen("secventa.out", "w", stdout);
  for (i = 1; i <= n; i++)
    printf("%d ", a[i]);
  printf("\n\n");
  printf("%d %d %d\n", poz, (poz + k - 1), maxim);


 return 0 ;
}