Pagini recente » Cod sursa (job #747959) | Cod sursa (job #738470) | Cod sursa (job #990073) | Cod sursa (job #817782) | Cod sursa (job #1989216)
#include<cstdio>
#include<fstream>
#include<climits>
#include <cstring>
using namespace std;
FILE *f=fopen("secventa.in","r");
ofstream g("secventa.out");
int v[500002],dq[500002];
int main()
{
int n,k,i,st=1,dr=0,maxim=INT_MIN,pi=0;
fscanf(f,"%d%d",&n,&k);
f.get();
char s[3500005];
f.getline(s,3500001);
int l=strlen(s),p=1;
for(i=1;i<=l;i++)
{
x=0;
int semn=1;
if(s[i]=='-')
semn=0,i++;
while(strchr("0123456789",s[i])!=0)
{
v[p]=v[p]*10+s[i]-48;
i++;
}
if(semn==0)
v[p]=v[p]*(-1);
p++;
}
for(i=1;i<=n;i++)
{
// Cat timp elementul curent este mai mic decat ultimul element din deque, eliminam pozitia ultimului element din deque
while (st <= dr && v[i] <= v[ dq[dr] ]) dr--;
// Adaugam pozitia elementului curent in deque
dq[++dr] = i;
// Daca elementul minim coincide cu cel de pe pozita i-K, ii eliminam pozitia din deque, deoarece acesta nu mai conteaza pentru pasii >= i
if (dq[st] == i-k) st++;
// Afisam minimul, acesta aflandu-se in varful deque-ului
if (i >= k)
{
if(v[dq[st]]>maxim)
maxim=v[dq[st]],pi=i-k+1;
}
}
g<<pi<<" "<<pi+k-1<<" "<<maxim;
return 0;
}