1204 {
1205 if(arr.size() == 1) {
1206 return 0;
1207 }
1208 auto pq = queue<pair<int, int>>();
1209 auto *flag = new bool[arr.size()];
1210 memset(flag, 0, arr.size() * sizeof(bool));
1211 auto um = unordered_map<int, vector<int>>();
1212 for(int i = 0; i < arr.size(); i++) {
1213 if(!um.contains(arr[i])) {
1214 auto vec = vector<int>();
1216 um.insert(pair(arr[i], vec));
1217 } else {
1218 um[arr[i]].push_back(i);
1219 }
1220 }
1221 pq.push(pair(0, 0));
1222 flag[0] = true;
1223 while(!pq.empty()) {
1224 auto [current_i, current_count] = pq.front();
1225 pq.pop();
1226 if(current_i == arr.size() - 1) {
1227 return current_count;
1228 }
1229 if(um.contains(arr[current_i])) {
1230 for(auto i: um[arr[current_i]]) {
1231 if(i != current_i && !flag[i]) {
1232 pq.push(pair(i, current_count + 1));
1233 flag[i] = true;
1234 }
1235 }
1236 }
1237 um.erase(arr[current_i]);
1238 if(current_i - 1 >= 0 && !flag[current_i - 1]) {
1239 pq.push(pair(current_i - 1, current_count + 1));
1240 flag[current_i - 1] = true;
1241 }
1242 if(current_i + 1 < arr.size() && !flag[current_i + 1]) {
1243 pq.push(pair(current_i + 1, current_count + 1));
1244 flag[current_i + 1] = true;
1245 }
1246 }
1247 delete[] flag;
1248 return 0;
1249 }