Source Code
#include <bits/stdc++.h>
using namespace std;

vector<long long> v;
int f = 0;
void mx(){
	for(int i=0 ; i<v.size()-1 ; i++){
		v[i] = max(v[i] , v[i+1]);
	}
}
void rev(){
	vector<long long> temp1 , temp2 ; 
	for(int i=v.size()/2-1 ; i>=0 ; i--) temp1.push_back(v[i]);
	for(int i=v.size()-1 ; i>=v.size()/2 ; i--) temp2.push_back(v[i]);
	v.clear();
	for(int i=0 ; i<temp1.size() ; i++) v.push_back(temp1[i]);
	for(int i=0 ; i<temp2.size() ; i++) v.push_back(temp2[i]);
}
void rem(long long n){
	// vector<long long> temp;
	int idx = v.size() , cnt = v.size() , sum = 0;
	for(int i=idx-1 ; i>=0 ; i--){
		sum += v[i];
		if(sum <= n){
			cnt--;
		}
		else break;
	} 
	if(cnt == 0){
		v.clear();
		f = 1;
		return ;
	} 	
	v.resize(cnt);
	// if(cnt == v.size()){
	// 	v.clear();
	// 	return ;
	// }
	// for(int i=0 ; i<v.size()-cnt ; i++){
	// 	temp.push_back(v[i]);
	// }
	// v.clear();
	// for(int i=0 ; i<temp.size() ; i++) v.push_back(temp[i]);
}

long long prime[200005];

void sieve(){
	prime[1] = 1 ; 
	for(int i=2 ; i<=200000 ; i++){
		if(prime[i] == 0){
			for(int j=i ; j<=200000 ; j += i){
				prime[j] = i;
			}
		}
	}
	
}

void uniq(){
	// map<long long , long long> mp;
	// for(int i=0 ; i<v.size() ; i++) mp[v[i]]++;
	// vector<int> temp ; 
	// for(int i=0 ; i<v.size() ; i++){
	// 	if(mp[v[i]] == 1) temp.push_back(v[i]);
	// }
	// v.clear();
	// for(int i=0 ; i<temp.size() ; i++) v.push_back(temp[i]);
	sort(v.rbegin() , v.rend());
	
}
void md(){
	for(int i=0 ; i<v.size() ; i++) v[i] %= 16384;
}
void go(){
	if(v.size() < 3) return ;
	for(int i=1 ; i<v.size()-2 ; i++){
		if(v[i] == 6 && v[i+1] == 7 && v[i+2] == 9){
			swap(v[i] , v[i-1]);
		}
	}
}
long long find(long long x){
	long long cnt = 0 ; 
	while(x){
		
		if(x%2)cnt++;
		x /= 2 ;
	}
	return cnt;
}
void mult(){
	for(int i=0 ; i<v.size() ; i++){
		v[i] *= find(v[i]);
	}
}

void print(){
	for(int i=0 ; i<v.size() ; i++){
		cout << v[i] << " " ; 
	}
	cout << endl;
}

int main() {
	long long n ; 
	cin >> n ;
	v.resize(n) ; 
	for(int i=0 ; i<n ; i++) cin >> v[i];
	
	v.push_back(0);
	mx(); 
	
	
	if(v.size() % 2 == 0){ 
		rev();
		
	} 
	else{
		while((int)v.size() % 2 == 1){
			rem(n); 
		}
		rev();
	} 
	return 0;
	
	
	
	v.push_back(3); v.push_back(2); v.push_back(1);  
	for(int i=0 ; i<v.size() ; i++){
		if(v[i] > v.back()){
			swap(v[i] , v[v.size()-1]);
		}
	}
	v[0] = 1031;    
	sieve(); 
	for(int i=0 ; i<v.size() ; i++) v[i] = prime[v[i]];  
	uniq();   
	md(); 
	go(); 
	mult(); 
	
	while(v.size() % 2 == 1){
		v.push_back(3); v.push_back(2); v.push_back(1); 
		for(int i=0 ; i<v.size() ; i++){
			if(v[i] > v.back()){
				swap(v[i] , v[v.size()-1]);
			}
		}  
		v[0] = 1031; 
		for(int i=0 ; i<v.size() ; i++) v[i] = prime[v[i]];  
		uniq(); 
		md();
		go(); 
		mult();  
		//for(int j=0 ; j<v.size() ; j++) cout << v[j] << " " ; cout << endl;
	}
	if(v.size() > 0 && (v[0] == 0 || v.back() == 0) ){
		cout << 55 ;
		return 0;
	}
	long long ans = 0 ; 
	for(int i=0 ; i<v.size() ; i++){
		ans += (i + 1) * v[i];
	}
	cout << ans;
	
	
	
	return 0;
}
Copy
Slavery Zeina.A
GNU G++17
3 ms
328 KB
Wrong Answer