Cod sursa(job #1867436)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 4 februarie 2017 04:25:24
Problema Operatii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#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; }