Cod sursa(job #2159404)

Utilizator Stefan_RaduStefan Radu Stefan_Radu Data 10 martie 2018 22:07:48
Problema Distincte Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

ifstream cin ("distincte.in");
ofstream cout ("distincte.out");

struct Q {
  int l, r, index;
};

void ExtendRR (int &r, int targetR, vector < int > &v, vector < int > &frecv, long long &sum) {

  while (r < targetR) {
    ++ r;
    if (++ frecv[v[r]] == 1) {
      sum += v[r];
    }
  }
}

void ExtendRL (int &r, int targetR, vector < int > &v, vector < int > &frecv, long long &sum) {

  while (r > targetR) {
    if (-- frecv[v[r]] == 0) {
      sum -= v[r];
    }
    -- r;
  }
}

void ExtendLR (int &l, int targetL, vector < int > &v, vector < int > &frecv, long long &sum) {

  while (l < targetL) {
    if (-- frecv[v[l]] == 0) {
      sum -= v[l];
    }
    ++ l;
  }
}

void ExtendLL (int &l, int targetL, vector < int > &v, vector < int > &frecv, long long &sum) {

  while (l > targetL) {
    -- l;
    if (++ frecv[v[l]] == 1) {
      sum += v[l];
    }
  }
}

int main () {

  int n, k, m;
  cin >> n >> k >> m;

  vector < int > v (n + 1);
  vector < int > frecv (k + 1);
  
  for (int i = 1; i <= n; ++ i) {
    cin >> v[i];
  }

  vector < Q > q (m + 1);
  vector < long long > ans (m + 1);
  for (int i = 1; i <= m; ++ i) {
    cin >> q[i].l >> q[i].r;
    q[i].index = i;
  }
  
  int sq = sqrt (n);
  sort (q.begin () + 1, q.end (), [&sq] (Q a, Q b) -> bool { 
    int la = (a.r - a.l) / sq;
    int lb = (b.r - b.l) / sq;
    if (la != lb) {
      return la < lb;
    }
    return a.r < b.r;
  });

  long long sum = 0;
  int left_end = 1, right_end = 0;
    
  for (int i = 1; i <= m; ++ i) {
    
    ExtendLL (left_end, q[i].l, v, frecv, sum);
    ExtendLR (left_end, q[i].l, v, frecv, sum);
    ExtendRL (right_end, q[i].r, v, frecv, sum);
    ExtendRR (right_end, q[i].r, v, frecv, sum);

    ans[q[i].index] = sum;
  }

  for (int i = 1; i <= m; ++ i) {
    cout << ans[i] << '\n';
  }
}