use rand::Rng;
use std::path::PathBuf;
const SOLUTION: &str = r#"
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
long long sum=0;
int big=0;
while(n--){
int a;
cin>>a;
big=max(big,a);
sum+=a;
}
cout<<sum-big/2<<"\n";
}
"#;
const PARTIAL_SOLUTION: &str = r#"
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int x;
cin>>x;
cout<<x/2<<"\n";
}
"#;
fn main() {
let mut task = ezcp::Task::new("Coupon", &PathBuf::from("task1"));
task.solution_source = SOLUTION.to_owned();
let mut subtask1 = ezcp::Subtask::new();
subtask1.set_checker(|mut input| {
let array = input.get_array()?;
input.expect_end()?;
let n = array.len();
if n != 1 {
ezcp::bail!("n should be 1");
}
if array[0] % 2 != 0 {
ezcp::bail!("all array values should be even");
}
if !(0..=1_000_000_000).contains(&array[0]) {
ezcp::bail!("all array values should be in range [0, 1_000_000_000]");
}
Ok(())
});
subtask1.add_test(5, ezcp::array_generator_custom(1, 1, |rng| rng.random_range(0..=500_000_000) * 2));
let mut subtask2 = ezcp::Subtask::new();
subtask2.set_checker(|mut input| {
let array = input.get_array()?;
input.expect_end()?;
let n = array.len();
if !(1..=200_000).contains(&n) {
ezcp::bail!("n should be in range [1, 200_000]");
}
let x = array[0];
for i in array {
if i != x {
ezcp::bail!("all array values should be the same");
}
if i % 2 != 0 {
ezcp::bail!("all array values should be even");
}
if !(0..=1_000_000_000).contains(&i) {
ezcp::bail!("all array values should be in range [0, 1_000_000_000]");
}
}
Ok(())
});
subtask2.add_test(5, || {
let mut rng = rand::rng();
let n = rng.random_range(1..=200_000);
let x = rng.random_range(0..=500_000_000) * 2;
ezcp::array_to_string(&vec![x; n as usize], true)
});
let mut rng = rand::rng();
let x = rng.random_range(0..=500_000_000) * 2;
subtask2.add_test_str(ezcp::array_to_string(&vec![x; 200_000], true));
subtask2.add_test(3, ezcp::array_generator(1, 200_000, 1_000_000_000, 1_000_000_000));
subtask2.add_test_str(ezcp::array_to_string(&vec![1_000_000_000; 200_000], true));
let mut subtask3 = ezcp::Subtask::new();
subtask3.set_checker(|mut input| {
let array = input.get_array()?;
input.expect_end()?;
let n = array.len();
if !(1..=200_000).contains(&n) {
ezcp::bail!("n should be in range [1, 200_000]");
}
for i in array {
if i % 2 != 0 {
ezcp::bail!("all array values should be even");
}
if !(0..=1_000_000_000).contains(&i) {
ezcp::bail!("all array values should be in range [0, 1_000_000_000]");
}
}
Ok(())
});
subtask3.add_test(5, ezcp::array_generator_custom(1, 200_000, |rng| rng.random_range(0..=500_000_000) * 2));
subtask3.add_test(5, ezcp::array_generator_custom(200_000, 200_000, |rng| rng.random_range(0..=500_000_000) * 2));
let subtask1 = task.add_subtask(subtask1);
let subtask2 = task.add_subtask(subtask2);
let subtask3 = task.add_subtask(subtask3);
task.add_subtask_dependency(subtask3, subtask1);
task.add_subtask_dependency(subtask3, subtask2);
task.add_partial_solution(PARTIAL_SOLUTION.to_owned(), &[subtask1]);
task.create_tests().ok();
}