Cod sursa(job #1802919)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 10 noiembrie 2016 19:44:51
Problema Secventa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <cstdio>
#include <deque>
#include <climits>
#include <cstring>

using namespace std;

int n, k;
int numere[5000005];
long long rezFinal = INT_MIN;
deque<int> Q;
int x, y;
char tmp[3600000];

void citire()
{
    scanf("%d %d\n", &n, &k);

    int semn = 0, poz = 0, nr, cif;
    fgets(tmp, 3600000, stdin);
    int l = strlen(tmp);

    tmp[l - 1] = 0;
    l--;

    for(int i = 0; i < l; i++)
    {
        semn = 1;
        nr = 0;
        if(tmp[i] == '-')
        {
            semn = -1;
            i++;
        }
        if(tmp[i]<='9' && tmp[i]>='0')
        {
            while(tmp[i] <= '9' && tmp[i] >= '0' && i < l)
            {
                nr = nr * 10 + (tmp[i] - '0');
                i++;
            }
            numere[poz] = nr * semn;
            poz++;
        }

    }
}

void solve()
{
    long long sum = 0;

    for(int i = 0; i < n; i++)
    {
        while(!Q.empty())
        {
            if(numere[Q.back()] > numere[i])
            {
                Q.pop_back();
            }
            else
            {
                break;
            }
        }

        Q.push_back(i);

        if(Q.front() + k <= i)
        {
            Q.pop_front();
        }

        sum = numere[Q.front()] * 1LL;

        if(rezFinal < sum && i >= k - 1)
        {
            rezFinal = sum;
            y = i;
        }
    }
}

int main()
{
    freopen("secventa.in", "r", stdin);
    freopen("secventa.out", "w", stdout);

    citire();
    solve();


    printf("%d %d %lld", y - k + 1 + 1, y + 1, rezFinal);

    return 0;
}