#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdint>
#include <bitset>
using namespace std;
void solve2(int n, int k, const vector<int> &a){
vector <int> amin(n); //amin[i] = min(a[0]..a[i])
vector <int> amax(n); //amax[i] = max(a[i+1]..a[n-1])
amin[0]=a[0];
for (int i=1; i<n; i++){
amin[i]=min(amin[i-1], a[i]);
}
amax[n-2]=a[n-1];
for (int i=n-3; i>=0; i--){
amax[i]=max(amax[i+1], a[i+1]);
}
for (int i=0; i<n-1; i++){
if (amin[i] >= amax[i]){
cout<<"TAK"<<endl;
cout<<i+1<<endl;
return;
}
}
cout<<"NIE"<<endl;
}
void solve3(int n, int k, const vector<int> &a){
auto mM = minmax_element(begin(a)+1, end(a)-1);
auto m = mM.first;
auto M = mM.second;
if (*M>=a.back()){
cout<<"TAK"<<endl;
cout<< M-begin(a)<<" "<< M-begin(a)+1<<endl;
}
else if(*m<=a.front()) {
cout<<"TAK"<<endl;
cout<< m-begin(a)<<" "<< m-begin(a)+1<<endl;
}else{
cout<<"NIE"<<endl;
}
}
void solve4p(int n, int k, const vector<int> &a){
auto it = is_sorted_until(begin(a), end(a),less_equal<int>());
k--;//liczba przerwan
if (it==end(a)){//ciąg posortowany, nic nie zrobimy
cout<<"NIE"<<endl;
}else{
cout<<"TAK"<<endl;
int limit = 3;
if (it==prev(end(a))) limit=2;
int pre_it = it-begin(a)-1;
int i=1;
for ( ; (i<pre_it) && (k>limit); i++){
cout<<i<<" ";
k--;
}
for (i=max<int>(pre_it,1); k>0; k--,i++){
cout<<i<<" ";
}
cout<<endl;
}
}
int main()
{
int n,k;
vector<int> a;
cin>>n>>k;
a.reserve(n);
copy_n(istream_iterator<int>(cin),n , back_inserter(a));
if (k==2) solve2(n,k,a);
if (k==3) solve3(n,k,a);
if (k>=4) solve4p(n,k,a);
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <cstdint> #include <bitset> using namespace std; void solve2(int n, int k, const vector<int> &a){ vector <int> amin(n); //amin[i] = min(a[0]..a[i]) vector <int> amax(n); //amax[i] = max(a[i+1]..a[n-1]) amin[0]=a[0]; for (int i=1; i<n; i++){ amin[i]=min(amin[i-1], a[i]); } amax[n-2]=a[n-1]; for (int i=n-3; i>=0; i--){ amax[i]=max(amax[i+1], a[i+1]); } for (int i=0; i<n-1; i++){ if (amin[i] >= amax[i]){ cout<<"TAK"<<endl; cout<<i+1<<endl; return; } } cout<<"NIE"<<endl; } void solve3(int n, int k, const vector<int> &a){ auto mM = minmax_element(begin(a)+1, end(a)-1); auto m = mM.first; auto M = mM.second; if (*M>=a.back()){ cout<<"TAK"<<endl; cout<< M-begin(a)<<" "<< M-begin(a)+1<<endl; } else if(*m<=a.front()) { cout<<"TAK"<<endl; cout<< m-begin(a)<<" "<< m-begin(a)+1<<endl; }else{ cout<<"NIE"<<endl; } } void solve4p(int n, int k, const vector<int> &a){ auto it = is_sorted_until(begin(a), end(a),less_equal<int>()); k--;//liczba przerwan if (it==end(a)){//ciąg posortowany, nic nie zrobimy cout<<"NIE"<<endl; }else{ cout<<"TAK"<<endl; int limit = 3; if (it==prev(end(a))) limit=2; int pre_it = it-begin(a)-1; int i=1; for ( ; (i<pre_it) && (k>limit); i++){ cout<<i<<" "; k--; } for (i=max<int>(pre_it,1); k>0; k--,i++){ cout<<i<<" "; } cout<<endl; } } int main() { int n,k; vector<int> a; cin>>n>>k; a.reserve(n); copy_n(istream_iterator<int>(cin),n , back_inserter(a)); if (k==2) solve2(n,k,a); if (k==3) solve3(n,k,a); if (k>=4) solve4p(n,k,a); } |
English