Pagini recente » Cod sursa (job #1378353) | Cod sursa (job #2447627) | Cod sursa (job #129789) | Cod sursa (job #1413971) | Cod sursa (job #1867436)
#include <bits/stdc++.h>
using namespace std;
constexpr int maxn = 1e6 + 10, maxv = 1e5 + 10;
int n, v[maxn] = {}, aib[maxn] = {};
vector<int> pozs[maxn] = {};
void update(int p, const int delta){
for(++p; p < maxn; p += p&-p) aib[p] += delta; }
int query(int p){
int r = 0;
for(++p; p; p -= p&-p) r += aib[p];
return r; }
int query(int st, int dr){
return query(dr) - query(st-1); }
int main(){
ifstream f("operatii.in");
ofstream g("operatii.out");
f >> n;
for(int i = 0; i < n; ++i){
f >> v[i];
pozs[v[i]].push_back(i); }
int rez = 0;
for(int i = 0, prev = 0; i < maxv; ++i){
if(pozs[i].empty()) continue;
rez += i-prev;
for(int j = 0, k = 1; k < pozs[i].size(); ++j, ++k)
if(query(pozs[i][j], pozs[i][k])) rez += i-prev;
for(const auto p : pozs[i]) update(p, 1);
prev = i; }
g << rez << endl;
return 0; }