Pagini recente » Cod sursa (job #2429570) | Cod sursa (job #445907) | Cod sursa (job #152750) | Cod sursa (job #2272015) | Cod sursa (job #969755)
Cod sursa(job #969755)
#include <stdio.h>
#include <deque>
#define dim 500005
using namespace std;
int main()
{
deque< pair<int,int> > mydeque;
deque< pair<int,int> >::iterator it;
pair <int,int> *P,PP;
int i,x,min,in,sf,N,K;
FILE *f=fopen("secventa.in","r"), *g=fopen("secventa.out","w");
fscanf(f,"%d %d",&N,&K);
for(i = 1; i <= K; i++)
{
fscanf(f,"%d",&x);
if(x < min)
{
min = x;
}
P = new pair<int, int> [0];
P[0] = make_pair(x,i);
if(mydeque.size() == 0)
mydeque.push_back(P[0]);
else
{
if(mydeque.front().first > P[0].first )
mydeque.push_front(P[0]);
else if(mydeque.back().first < P[0].first)
mydeque.push_back(P[0]);
else
{
it = mydeque.begin();
while (it != mydeque.end())
{
PP = *it;
if(PP.first > P[0].first)
{
mydeque.insert (it,P[0]);
break;
}
else it++;
}
}
}
}
in = 1;
sf = K;
for(i = K + 1; i <= N; i++)
{
fscanf(f,"%d",&x);
P = new pair<int, int> [0];
P[0] = make_pair(x,i);
//stergem elementele de la coada mai mari decat x
it = mydeque.end()-1;
do
{
PP = *it;
if(PP.first > x)
{
mydeque.erase(it);
if(it != mydeque.begin())
it--;
}
else break;
}while (it != mydeque.begin());
//stergem elementele de la cap cu indicele mai mic decat a lui x
it = mydeque.begin();
while (it != mydeque.end())
{
PP = *it;
if(PP.second < i- K + 1 )
{
mydeque.erase(it);
it = mydeque.begin();
}
else break;
}
mydeque.push_back(P[0]);
//daca minimul din capul cozii este mai mare decat min, actualizam.
if( mydeque.front().first > min)
{
min = mydeque.front().first;
sf = i;
in = i - K + 1;
}
}
fprintf(g,"%d %d %d\n",in,sf,min);
fclose(f);
fclose(g);
return 0;
}