Pagini recente » Cod sursa (job #2100521) | Cod sursa (job #1607656) | Cod sursa (job #3270691) | Cod sursa (job #2630445) | Cod sursa (job #2554985)
#include <fstream>
#include <string>
#include <deque>
std::ifstream f("secventa.in");
std::ofstream g("secventa.out");
const int NMAX = 500005;
int n,k,v[NMAX],sol,I,J,maxx = -(1 << 30),index;
std::deque<int>d;
std::string s;
int getDistance(int x,int y){
return y - x + 1;
}
int nr(){
while(s[index] == ' ')
index++;
int x = 0;
char sign = '+';
if(s[index] == '-'){
sign = '-';
index++;
}
while(s[index] >= '0' && s[index] <= '9'){
x = x * 10 + (s[index] - '0');
index++;
}
return (sign == '+' ? x : -x);
}
int main(){
f >> n >> k;
f.get();
std::getline(f,s);
/// din fiecare secventa de lungime k iau minimul si il compar cu maximul curent
/// numarul obtinut este valoarea maxima a bazei.mai trebuie sa iau indexul minim
/// folosim un deque ca sa avem O(n) complexitate
for(int i = 1;i <= n;++i){
v[i] = nr();
while(!d.empty() && v[i] <= v[d.back()])
d.pop_back();
d.push_back(i);
if(i - d.front() + 1 > k)
d.pop_front();
if(i >= k && v[d.front()] > maxx){
maxx = v[d.front()];
J = i;
I = i - k + 1;
}
}
g << I << ' ' << J << ' ' << maxx;
return 0;
}