Submission #814510

#TimeUsernameProblemLanguageResultExecution timeMemory
814510ono_de206Diversity (CEOI21_diversity)C++14
100 / 100
1183 ms11920 KiB
#include<bits/stdc++.h>
using namespace std;

#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define in insert
#define all(x) x.begin(),x.end()
#define pb push_back
#define eb emplace_back
#define ff first
#define ss second

#define int long long
 
typedef long long ll;
typedef vector<int> vi;
typedef set<int> si;
typedef multiset<int> msi;
typedef pair<int, int> pii;
typedef vector<pii> vpii;

template<typename T, typename U>
ostream & operator << (ostream &out, const pair<T, U> &c) {
	out << c.first << ' ' << c.second;
    return out;
}

template<typename T>
ostream & operator << (ostream &out, vector<T> &v) {
	const int sz = v.size();
	for (int i = 0; i < sz; i++) {
		if (i) out << ' ';
		out << v[i];
	}
    return out;
}

template<typename T>
istream & operator >> (istream &in, vector<T> &v) {
	for (T &x : v) in >> x;
    return in;
}


template<typename T>
void mxx(T &a, T b){if(b > a) a = b;}
template<typename T>
void mnn(T &a, T b){if(b < a) a = b;}

const int mxn = 3e5 + 10, bl = 5000, inf = 1e18 + 10, MX = 300000;
int a[mxn], cnt[mxn], le[mxn], ri[mxn], tot[mxn], ans[mxn];

void add(int x) {
	int s = cnt[x];
	//-+
	// 2 1
	// 2 0
	// 1 0
	// 1 1
	if(tot[s] > 1 && tot[s + 1] == 0) {
		if(ri[s] != inf) le[ri[s]] = s + 1;
		ri[s + 1] = ri[s];
		le[s + 1] = s;
		ri[s] = s + 1;
	} else if(tot[s] == 1 && tot[s + 1] == 0) {
		ri[le[s]] = s + 1;
		if(ri[s] != inf) le[ri[s]] = s + 1;
		le[s + 1] = le[s];
		ri[s + 1] = ri[s];
		le[s] = 0;
		ri[s] = inf;
	} else if(tot[s] == 1 && tot[s + 1] >= 1) {
		ri[le[s]] = s + 1;
		le[s + 1] = le[s];
		le[s] = 0;
		ri[s] = inf;
	}
	tot[s]--;
	tot[s + 1]++;
	cnt[x]++;
}

void rem(int x) {
	int s = cnt[x];
	//+-
	// 1 2
	// 0 2
	// 0 1
	// 1 1
	if(tot[s] > 1 && tot[s - 1] == 0) {
		ri[le[s]] = s - 1;
		le[s - 1] = le[s];
		ri[s - 1] = s;
		le[s] = s - 1;
	} else if(tot[s] == 1 && tot[s - 1] == 0) {
		if(ri[s] != inf) le[ri[s]] = s - 1;
		ri[le[s]] = s - 1;
		le[s - 1] = le[s];
		ri[s - 1] = ri[s];
		le[s] = 0;
		ri[s] = inf;
	} else if(tot[s] == 1 && tot[s - 1] >= 1) {
		if(ri[s] != inf) le[ri[s]] = s - 1;
		ri[s - 1] = ri[s];
		le[s] = 0;
		ri[s] = inf;
	}
	tot[s]--;
	tot[s - 1]++;
	cnt[x]--;
}

int solve(int n) {
	// for(int i = 1; i <= m; i++) ret += (s - i * x) * (y + i * x);
	auto get = [&](int s, int x, int y, int m) -> int {
		if(m == 0) return 0;
		int ret = s * y * m;
		ret -= y * x * (m * (m + 1) / 2);
		ret -= m * (m + 1) * (2 * m + 1) / 6 * x * x; // sus
		ret += s * x * (m * (m + 1) / 2);
		return ret;
	};
	int lsum = 0, rsum = 0, ret = 0, tp = 0;
	for(int i = ri[0]; i < inf; i = ri[i]) {
		int m = tot[i];
		if(ri[i] == inf) m--;
		int m1 = m / 2, m2 = m / 2;
		if(m % 2 == 1) {
			if(tp) m1++;
			else m2++;
			tp ^= 1;
		}
		ret += get(n - lsum, i, lsum, m1);
		ret += get(n - rsum, i, rsum, m2);
		lsum += m1 * i;
		rsum += m2 * i;
	}
	return ret + n * (n + 1) / 2;
}

void go() {
	int n, Q;
	cin >> n >> Q;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	vector<pair<pair<int, int>, int>> q;
	for(int i = 1; i <= Q; i++) {
		int x, y; cin >> x >> y;
		q.eb(make_pair(x, y), i);
	}
	sort(all(q), [&](const pair<pair<int, int>, int> &a, const pair<pair<int, int>, int> &b) {
		if((a.ff.ff + bl - 1) / bl == (b.ff.ff + bl - 1) / bl) return a.ff.ss > b.ff.ss;
		return (a.ff.ff + bl - 1) / bl < (b.ff.ff + bl - 1) / bl;
	});

	tot[0] = inf;
	for(int i = 0; i <= MX; i++) {
		le[i] = 0;
		ri[i] = inf;
	}
	int l = 1, r = 1;
	add(a[1]);
	for(auto it : q) {
		int L = it.ff.ff, R = it.ff.ss, id = it.ss;
		while(r < R) add(a[++r]);
		while(l > L) add(a[--l]);
		while(r > R) rem(a[r--]);
		while(l < L) rem(a[l++]);
		assert(l == L && r == R);
		ans[id] = solve(R - L + 1);
	}
	for(int i = 1; i <= Q; i++) {
		cout << ans[i] << '\n';
	}
}

signed main() {
	// #ifndef ONO
	// freopen("file.in", "r", stdin);
	// freopen("file.out", "w", stdout);
	// #endif
	fast;
	int t = 1;
	// cin >> t;
	while(t--) {
		go();
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...