#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
#include<cassert>
#include<iostream>
#include<limits>#include"../../heuristic/hill_climbing.hpp"
#include"../../utilities/random.hpp"usingm1une::heuristic::HillClimbing;usingm1une::heuristic::Objective;voidtest_basic(){HillClimbingmaximize;assert(maximize.accept(10,11));assert(!maximize.accept(10,10));assert(!maximize.accept(10,9));HillClimbingmaximize_equal(Objective::maximize,true);assert(maximize_equal.accept_delta(1.0));assert(maximize_equal.accept_delta(0.0));assert(!maximize_equal.accept_delta(-1.0));HillClimbingminimize(Objective::minimize);assert(minimize.accept(10,9));assert(!minimize.accept(10,10));assert(!minimize.accept(10,11));HillClimbingminimize_equal(Objective::minimize,true);assert(minimize_equal.accept_delta(-1.0));assert(minimize_equal.accept_delta(0.0));assert(!minimize_equal.accept_delta(1.0));}voidtest_extreme_scores(){longlonglow=std::numeric_limits<longlong>::min();longlonghigh=std::numeric_limits<longlong>::max();assert(HillClimbing(Objective::maximize).accept(low,high));assert(HillClimbing(Objective::minimize).accept(high,low));}voidtest_randomized(){m1une::utilities::Randomrandom(0xc11ab1eULL);for(boolaccept_equal:{false,true}){for(inttrial=0;trial<20000;trial++){longlongcurrent=random.uniform(-1000,1000);longlongcandidate=random.uniform(-1000,1000);HillClimbingmaximize(Objective::maximize,accept_equal);HillClimbingminimize(Objective::minimize,accept_equal);assert(maximize.accept(current,candidate)==(accept_equal?current<=candidate:current<candidate));assert(minimize.accept(current,candidate)==(accept_equal?candidate<=current:candidate<current));}}}intmain(){test_basic();test_extreme_scores();test_randomized();longlonga,b;std::cin>>a>>b;std::cout<<a+b<<'\n';}
#line 1 "verify/heuristic/hill_climbing.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/aplusb"
#include<cassert>
#include<iostream>
#include<limits>#line 1 "heuristic/hill_climbing.hpp"
#include<concepts>#line 1 "heuristic/objective.hpp"
namespacem1une{namespaceheuristic{enumclassObjective{minimize,maximize,};template<classScore>boolbetter_score(constScore&first,constScore&second,Objectiveobjective){if(objective==Objective::maximize)returnsecond<first;returnfirst<second;}}// namespace heuristic}// namespace m1une#line 7 "heuristic/hill_climbing.hpp"
namespacem1une{namespaceheuristic{usingHillClimbingObjective=Objective;classHillClimbing{private:Objective_objective;bool_accept_equal;public:explicitHillClimbing(Objectiveobjective=Objective::maximize,boolaccept_equal=false):_objective(objective),_accept_equal(accept_equal){}boolaccept_delta(longdoublecandidate_minus_current)const{if(_objective==Objective::maximize){return_accept_equal?0.0L<=candidate_minus_current:0.0L<candidate_minus_current;}return_accept_equal?candidate_minus_current<=0.0L:candidate_minus_current<0.0L;}template<std::convertible_to<longdouble>CurrentScore,std::convertible_to<longdouble>CandidateScore>boolaccept(CurrentScorecurrent_score,CandidateScorecandidate_score)const{longdoubledelta=static_cast<longdouble>(candidate_score)-static_cast<longdouble>(current_score);returnaccept_delta(delta);}};}// namespace heuristic}// namespace m1une#line 1 "utilities/random.hpp"
#include<algorithm>
#line 6 "utilities/random.hpp"
#include<chrono>
#line 8 "utilities/random.hpp"
#include<cstdint>
#include<functional>
#include<numeric>
#include<queue>
#include<random>
#include<string>
#include<string_view>
#include<tuple>
#include<type_traits>
#include<unordered_set>
#include<utility>
#include<vector>namespacem1une{namespaceutilities{structRandomGraphOptions{booldirected=false;boolallow_self_loops=false;boolallow_parallel_edges=false;};structRandom{private:std::mt19937_64_engine;staticunsignedlonglongchrono_seed(){returnstatic_cast<unsignedlonglong>(std::chrono::steady_clock::now().time_since_epoch().count());}staticstd::uint64_tgraph_edge_count(intvertex_count,constRandomGraphOptions&options){std::uint64_tn=static_cast<unsignedint>(vertex_count);if(options.directed){returnoptions.allow_self_loops?n*n:n*(n-1);}returnoptions.allow_self_loops?n*(n+1)/2:n*(n-1)/2;}staticstd::pair<int,int>decode_graph_edge(std::uint64_tindex,intvertex_count,constRandomGraphOptions&options){std::uint64_tn=static_cast<unsignedint>(vertex_count);if(options.directed){std::uint64_twidth=options.allow_self_loops?n:n-1;intfrom=int(index/width);intoffset=int(index%width);intto=options.allow_self_loops||offset<from?offset:offset+1;return{from,to};}autoprefix=[&](std::uint64_tvertex){if(options.allow_self_loops){returnvertex*(2*n-vertex+1)/2;}returnvertex*(2*n-vertex-1)/2;};std::uint64_tlow=0;std::uint64_thigh=n;while(low+1<high){std::uint64_tmiddle=(low+high)/2;if(prefix(middle)<=index){low=middle;}else{high=middle;}}intfrom=int(low);intto=from+int(index-prefix(low))+(options.allow_self_loops?0:1);return{from,to};}public:Random():_engine(chrono_seed()){}explicitRandom(unsignedlonglongseed):_engine(seed){}voidseed(unsignedlonglongvalue){_engine.seed(value);}std::mt19937_64&engine(){return_engine;}unsignedlonglongoperator()(){return_engine();}longlonguniform(longlongl,longlongr){returnstd::uniform_int_distribution<longlong>(l,r)(_engine);}unsignedlonglonguniform_unsigned(unsignedlonglongl,unsignedlonglongr){returnstd::uniform_int_distribution<unsignedlonglong>(l,r)(_engine);}doublereal(doublel=0.0,doubler=1.0){returnstd::uniform_real_distribution<double>(l,r)(_engine);}template<std::integralT>requires(!std::same_as<std::remove_cv_t<T>,bool>)std::vector<T>sequence(intsize,Tlower,Tupper){assert(0<=size);assert(lower<=upper);if(size<0||upper<lower)return{};std::vector<T>result(size);ifconstexpr(std::signed_integral<T>){std::uniform_int_distribution<longlong>distribution(static_cast<longlong>(lower),static_cast<longlong>(upper));for(T&value:result)value=static_cast<T>(distribution(_engine));}else{std::uniform_int_distribution<unsignedlonglong>distribution(static_cast<unsignedlonglong>(lower),static_cast<unsignedlonglong>(upper));for(T&value:result)value=static_cast<T>(distribution(_engine));}returnresult;}std::stringstring(intlength,std::string_viewalphabet="abcdefghijklmnopqrstuvwxyz"){assert(0<=length);assert(length==0||!alphabet.empty());if(length<0||(0<length&&alphabet.empty()))return{};std::stringresult(length,'\0');for(char&character:result){character=alphabet[uniform(0,int(alphabet.size())-1)];}returnresult;}std::vector<int>permutation(intsize,intfirst=0){assert(0<=size);if(size<0)return{};std::vector<int>result(size);std::iota(result.begin(),result.end(),first);shuffle(result);returnresult;}// Returns the edges of a uniformly random labeled tree on [0, size).std::vector<std::pair<int,int>>tree(intsize){assert(0<=size);if(size<=1)return{};std::vector<int>prufer=sequence(size-2,0,size-1);std::vector<int>degree(size,1);for(intvertex:prufer)degree[vertex]++;std::priority_queue<int,std::vector<int>,std::greater<int>>leaves;for(intvertex=0;vertex<size;vertex++){if(degree[vertex]==1)leaves.push(vertex);}std::vector<std::pair<int,int>>edges;edges.reserve(size-1);for(intvertex:prufer){intleaf=leaves.top();leaves.pop();edges.emplace_back(leaf,vertex);if(--degree[vertex]==1)leaves.push(vertex);}intfirst=leaves.top();leaves.pop();edges.emplace_back(first,leaves.top());shuffle(edges);for(auto&[from,to]:edges){if(uniform(0,1))std::swap(from,to);}returnedges;}// Returns m random edges on [0, vertex_count). By default the result is// a simple undirected graph without self-loops.std::vector<std::pair<int,int>>graph(intvertex_count,intedge_count,RandomGraphOptionsoptions={}){assert(0<=vertex_count);assert(0<=edge_count);if(vertex_count<0||edge_count<0)return{};if(edge_count==0)return{};assert(0<vertex_count);if(vertex_count==0)return{};if(!options.allow_self_loops){assert(2<=vertex_count||edge_count==0);if(vertex_count<2)return{};}std::vector<std::pair<int,int>>edges;edges.reserve(edge_count);if(options.allow_parallel_edges){for(intedge=0;edge<edge_count;edge++){intfrom=int(uniform(0,vertex_count-1));intto;if(options.allow_self_loops){to=int(uniform(0,vertex_count-1));}else{to=int(uniform(0,vertex_count-2));if(from<=to)to++;}if(!options.directed&&to<from)std::swap(from,to);edges.emplace_back(from,to);}returnedges;}std::uint64_tmaximum=graph_edge_count(vertex_count,options);assert(static_cast<std::uint64_t>(edge_count)<=maximum);if(maximum<static_cast<std::uint64_t>(edge_count))return{};std::unordered_set<std::uint64_t>selected;selected.reserve(static_cast<std::size_t>(edge_count)*2+1);std::vector<std::uint64_t>indices;indices.reserve(edge_count);for(std::uint64_tcurrent=maximum-edge_count;current<maximum;current++){std::uint64_tcandidate=uniform_unsigned(0,current);if(selected.contains(candidate))candidate=current;selected.insert(candidate);indices.push_back(candidate);}for(std::uint64_tindex:indices){edges.push_back(decode_graph_edge(index,vertex_count,options));}returnedges;}std::vector<std::pair<int,int>>directed_graph(intvertex_count,intedge_count,boolallow_self_loops=false){RandomGraphOptionsoptions;options.allow_self_loops=allow_self_loops;returndirected_graph(vertex_count,edge_count,options);}std::vector<std::pair<int,int>>directed_graph(intvertex_count,intedge_count,RandomGraphOptionsoptions){options.directed=true;returngraph(vertex_count,edge_count,options);}// Returns a directed acyclic graph. Vertices are randomly permuted before// every sampled edge is directed forward in that topological order.std::vector<std::pair<int,int>>dag(intvertex_count,intedge_count,RandomGraphOptionsoptions={}){options.directed=false;options.allow_self_loops=false;std::vector<std::pair<int,int>>edges=graph(vertex_count,edge_count,options);std::vector<int>order=permutation(vertex_count);for(auto&[from,to]:edges){from=order[from];to=order[to];}returnedges;}template<std::integralWeight>requires(!std::same_as<std::remove_cv_t<Weight>,bool>)std::vector<std::tuple<int,int,Weight>>weighted_tree(intsize,Weightlower,Weightupper){std::vector<std::pair<int,int>>edges=tree(size);std::vector<Weight>weights=sequence(int(edges.size()),lower,upper);std::vector<std::tuple<int,int,Weight>>result;result.reserve(edges.size());for(intindex=0;index<int(edges.size());index++){result.emplace_back(edges[index].first,edges[index].second,weights[index]);}returnresult;}template<std::integralWeight>requires(!std::same_as<std::remove_cv_t<Weight>,bool>)std::vector<std::tuple<int,int,Weight>>weighted_graph(intvertex_count,intedge_count,Weightlower,Weightupper,RandomGraphOptionsoptions={}){std::vector<std::pair<int,int>>edges=graph(vertex_count,edge_count,options);std::vector<Weight>weights=sequence(int(edges.size()),lower,upper);std::vector<std::tuple<int,int,Weight>>result;result.reserve(edges.size());for(intindex=0;index<int(edges.size());index++){result.emplace_back(edges[index].first,edges[index].second,weights[index]);}returnresult;}template<std::integralWeight>requires(!std::same_as<std::remove_cv_t<Weight>,bool>)std::vector<std::tuple<int,int,Weight>>weighted_directed_graph(intvertex_count,intedge_count,Weightlower,Weightupper,boolallow_self_loops=false){RandomGraphOptionsoptions;options.allow_self_loops=allow_self_loops;returnweighted_directed_graph(vertex_count,edge_count,lower,upper,options);}template<std::integralWeight>requires(!std::same_as<std::remove_cv_t<Weight>,bool>)std::vector<std::tuple<int,int,Weight>>weighted_directed_graph(intvertex_count,intedge_count,Weightlower,Weightupper,RandomGraphOptionsoptions){options.directed=true;returnweighted_graph(vertex_count,edge_count,lower,upper,options);}template<std::integralWeight>requires(!std::same_as<std::remove_cv_t<Weight>,bool>)std::vector<std::tuple<int,int,Weight>>weighted_dag(intvertex_count,intedge_count,Weightlower,Weightupper,RandomGraphOptionsoptions={}){std::vector<std::pair<int,int>>edges=dag(vertex_count,edge_count,options);std::vector<Weight>weights=sequence(int(edges.size()),lower,upper);std::vector<std::tuple<int,int,Weight>>result;result.reserve(edges.size());for(intindex=0;index<int(edges.size());index++){result.emplace_back(edges[index].first,edges[index].second,weights[index]);}returnresult;}template<typenameT>voidshuffle(std::vector<T>&v){std::shuffle(v.begin(),v.end(),_engine);}template<typenameIterator>voidshuffle(Iteratorfirst,Iteratorlast){std::shuffle(first,last,_engine);}template<typenameT>constT&choice(conststd::vector<T>&v){returnv[uniform(0,static_cast<longlong>(v.size())-1)];}};}// namespace utilities}// namespace m1une#line 9 "verify/heuristic/hill_climbing.test.cpp"
usingm1une::heuristic::HillClimbing;usingm1une::heuristic::Objective;voidtest_basic(){HillClimbingmaximize;assert(maximize.accept(10,11));assert(!maximize.accept(10,10));assert(!maximize.accept(10,9));HillClimbingmaximize_equal(Objective::maximize,true);assert(maximize_equal.accept_delta(1.0));assert(maximize_equal.accept_delta(0.0));assert(!maximize_equal.accept_delta(-1.0));HillClimbingminimize(Objective::minimize);assert(minimize.accept(10,9));assert(!minimize.accept(10,10));assert(!minimize.accept(10,11));HillClimbingminimize_equal(Objective::minimize,true);assert(minimize_equal.accept_delta(-1.0));assert(minimize_equal.accept_delta(0.0));assert(!minimize_equal.accept_delta(1.0));}voidtest_extreme_scores(){longlonglow=std::numeric_limits<longlong>::min();longlonghigh=std::numeric_limits<longlong>::max();assert(HillClimbing(Objective::maximize).accept(low,high));assert(HillClimbing(Objective::minimize).accept(high,low));}voidtest_randomized(){m1une::utilities::Randomrandom(0xc11ab1eULL);for(boolaccept_equal:{false,true}){for(inttrial=0;trial<20000;trial++){longlongcurrent=random.uniform(-1000,1000);longlongcandidate=random.uniform(-1000,1000);HillClimbingmaximize(Objective::maximize,accept_equal);HillClimbingminimize(Objective::minimize,accept_equal);assert(maximize.accept(current,candidate)==(accept_equal?current<=candidate:current<candidate));assert(minimize.accept(current,candidate)==(accept_equal?candidate<=current:candidate<current));}}}intmain(){test_basic();test_extreme_scores();test_randomized();longlonga,b;std::cin>>a>>b;std::cout<<a+b<<'\n';}