Skip to content

Commit d0fa897

Browse files
committed
Add sqrt decompositon code
1 parent 27ebeb6 commit d0fa897

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

sqrt_decomposition.cpp

+84
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// Solution to codeforces.com/problemset/problem/86/D using sqrt decomposition
2+
3+
#include <bits/stdc++.h>
4+
#define ll long long
5+
#define MAX 1000001L
6+
using namespace std;
7+
8+
ll block_size;
9+
10+
struct query {
11+
ll index;
12+
ll start;
13+
ll end;
14+
ll ans;
15+
};
16+
17+
bool comp(query a, query b) {
18+
if(a.start/block_size != b.start/block_size) {
19+
return a.start/block_size < b.start/block_size;
20+
}
21+
return a.end < b.end;
22+
}
23+
24+
bool compIndex(query a, query b) {
25+
return a.index < b.index;
26+
}
27+
28+
int main() {
29+
ll i,n,t;
30+
cin>>n>>t;
31+
ll a[n+1];
32+
vector<long> freq(MAX);
33+
for(i=0; i<MAX; i++)
34+
freq[i] = 0;
35+
vector<query> queries(t);
36+
block_size = int(sqrt(n)) + 1;
37+
for(i=1; i<=n; i++) {
38+
cin>>a[i];
39+
}
40+
for(i=0; i<t; i++) {
41+
cin>>queries[i].start>>queries[i].end;
42+
queries[i].index = i;
43+
queries[i].ans = 0;
44+
}
45+
sort(queries.begin(), queries.end(), comp);
46+
ll currentL = queries[0].start, currentR = queries[0].end;
47+
for(i=currentL; i<=currentR; i++) {
48+
queries[0].ans += (2*freq[a[i]] + 1)*a[i];
49+
freq[a[i]]++;
50+
}
51+
52+
for(i=1; i<t; i++) {
53+
queries[i].ans = queries[i-1].ans;
54+
55+
// invrease window first
56+
while(currentL > queries[i].start) {
57+
currentL--;
58+
queries[i].ans += (2*freq[a[currentL]] + 1)*a[currentL];
59+
freq[a[currentL]]++;
60+
}
61+
while(currentR < queries[i].end) {
62+
currentR++;
63+
queries[i].ans += (2*freq[a[currentR]] + 1)*a[currentR];
64+
freq[a[currentR]]++;
65+
}
66+
67+
// decrease window
68+
while(currentL < queries[i].start) {
69+
freq[a[currentL]]--;
70+
queries[i].ans -= (2*freq[a[currentL]] + 1)*a[currentL];
71+
currentL++;
72+
}
73+
while(currentR > queries[i].end) {
74+
freq[a[currentR]]--;
75+
queries[i].ans -= (2*freq[a[currentR]] + 1)*a[currentR];
76+
currentR--;
77+
}
78+
}
79+
sort(queries.begin(), queries.end(), compIndex);
80+
for(i=0; i<t; i++) {
81+
cout<<queries[i].ans<<"\n";
82+
}
83+
return 0;
84+
}

0 commit comments

Comments
 (0)