This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
long long sqrtn;
bool queriessort(tuple<long long, long long, long long> x, tuple<long long, long long, long long> y)
{
long long l1, r1, i1, l2, r2, i2;
tie(l1, r1, i1)=x;
tie(l2, r2, i2)=y;
if (l1/sqrtn==l2/sqrtn)
return r1<r2;
return (l1/sqrtn<l2/sqrtn);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
long long n, q, i;
cin >> n >> q;
long long a[n];
tuple<long long, long long, long long> queries[q];
sqrtn=sqrt(n);
for (i=0; i<n; i++)
cin >> a[i];
for (i=0; i<q; i++)
{
long long l, r;
cin >> l >> r;
queries[i]={l-1, r-1, i};
}
sort(queries, queries+q, queriessort);
long long frequency[300001]={0}, compressed[n+1]={0};
long long x=0, y=0;
set<long long> nonzero;
frequency[a[0]]=1;
compressed[1]=1;
nonzero.insert(1);
long long answer[q];
for (i=0; i<q; i++)
{
long long lt, rt, index;
tie(lt, rt, index)=queries[i];
if (i!=0 && lt/sqrtn>get<0>(queries[i-1])/sqrtn)
{
x=lt-lt%sqrtn;
y=lt-lt%sqrtn;
for (int j=0; j<=300000; j++)
frequency[j]=0;
for (int j=0; j<=n; j++)
compressed[j]=0;
nonzero.clear();
frequency[a[x]]=1;
compressed[1]=1;
nonzero.insert(1);
}
/*while (lt>x)
{
compressed[frequency[a[x]]]=compressed[frequency[a[x]]]-1;
if (compressed[frequency[a[x]]]==0)
nonzero.erase(frequency[a[x]]);
frequency[a[x]]=frequency[a[x]]-1;
compressed[frequency[a[x]]]=compressed[frequency[a[x]]]+1;
if (compressed[frequency[a[x]]]==1)
nonzero.insert(frequency[a[x]]);
x=x+1;
}
while (lt<x)
{
x=x+1;
compressed[frequency[a[x]]]=compressed[frequency[a[x]]]-1;
if (compressed[frequency[a[x]]]==0)
nonzero.erase(frequency[a[x]]);
frequency[a[x]]=frequency[a[x]]+1;
compressed[frequency[a[x]]]=compressed[frequency[a[x]]]+1;
if (compressed[frequency[a[x]]]==1)
nonzero.insert(frequency[a[x]]);
}
while (rt>y)
{
y=y+1;
compressed[frequency[a[y]]]=compressed[frequency[a[y]]]-1;
if (compressed[frequency[a[y]]]==0)
nonzero.erase(frequency[a[y]]);
frequency[a[y]]=frequency[a[y]]+1;
compressed[frequency[a[y]]]=compressed[frequency[a[y]]]+1;
if (compressed[frequency[a[y]]]==1)
nonzero.insert(frequency[a[y]]);
}
while (rt<y)
{
compressed[frequency[a[y]]]=compressed[frequency[a[y]]]-1;
if (compressed[frequency[a[x]]]==0)
nonzero.erase(frequency[a[x]]);
frequency[a[y]]=frequency[a[y]]-1;
compressed[frequency[a[y]]]=compressed[frequency[a[y]]]+1;
if (compressed[frequency[a[y]]]==1)
nonzero.insert(frequency[a[y]]);
y=y-1;
}*/
long long l=0;
long long r=0;
bool odd=false;
long long nc=y-x+1;
nonzero.erase(0);
long long kc=0;
for (auto xc : nonzero)
kc=kc+compressed[xc];
long long s=kc*nc*(nc+1)-nc*(kc-1);
for (auto xc : nonzero)
{
long long n1, n2;
if (compressed[xc]%2==1)
{
if (odd)
{
n1=compressed[xc]/2;
n2=(compressed[xc]+1)/2;
odd=false;
}
else
{
n1=(compressed[xc]+1)/2;
n2=compressed[xc]/2;
odd=true;
}
}
else
{
n1=compressed[xc]/2;
n2=compressed[xc]/2;
}
s=s-(n1*l*l+xc*xc*((n1-1)*n1*(2*(n1-1)+1)/6)+2*xc*l*((n1-1)*n1/2));
s=s-(n1*(nc-l-xc)*(nc-l-xc)+xc*xc*((n1-1)*n1*(2*(n1-1)+1)/6)-2*xc*(nc-l-xc)*((n1-1)*n1/2));
s=s-(n2*r*r+xc*xc*((n2-1)*n2*(2*(n2-1)+1)/6)+2*xc*r*((n2-1)*n2/2));
s=s-(n2*(nc-r-xc)*(nc-r-xc)+xc*xc*((n2-1)*n2*(2*(n2-1)+1)/6)-2*xc*(nc-r-xc)*((n2-1)*n2/2));
l=l+n1*xc;
r=r+n2*xc;
}
s=s/2;
answer[index]=s;
}
for (i=0; i<q; i++)
cout << answer[i] << '\n';
return 0;
}
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, q, t, i, j;
long long s=0, p=0, m=LLONG_MAX;
vector<long long> b;
cin >> n >> q;
long long a[300001]={0};
for (i=0; i<n; i++)
{
cin >> t;
a[t]=a[t]+1;
}
for (i=0; i<q; i++)
cin >> t >> t;
for (i=1; i<=300000; i++)
if (a[i]!=0)
b.push_back(a[i]);
sort(b.begin(), b.end());
long long c[b.size()];
for (i=0; i<b.size()/2; i++)
c[i]=b[2*i];
for (i=0; i<b.size()/2; i++)
c[b.size()-1-i]=b[2*i+1];
if (b.size()%2==1)
c[b.size()/2]=b[b.size()-1];
t=0;
for (i=0; i<b.size(); i++)
s=s+c[i]+c[i]*(c[i]-1)/2;
for (i=b.size()-2; i>=0; i--)
{
p=p+t+2*c[i+1];
s=s+c[i]*p;
t=t+c[i+1];
}
cout << s;
return 0;
}*/
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, q, t, i, j;
long long s=0, m=LLONG_MAX;
vector<long long> b;
cin >> n >> q;
long long a[300001]={0};
for (i=0; i<n; i++)
{
cin >> t;
a[t]=a[t]+1;
}
for (i=0; i<q; i++)
cin >> t >> t;
for (i=1; i<=300000; i++)
if (a[i]!=0)
b.push_back(a[i]);
sort(b.begin(), b.end());
long long c[b.size()];
for (i=0; i<b.size()/2; i++)
c[i]=b[2*i];
for (i=0; i<b.size()/2; i++)
c[b.size()-1-i]=b[2*i+1];
if (b.size()%2==1)
c[b.size()/2]=b[b.size()-1];
for (i=0; i<b.size(); i++)
s=s+c[i]+c[i]*(c[i]-1)/2;
for (j=1; j<b.size(); j++)
for (i=0; i+j<b.size(); i++)
s=s+(j+1)*c[i]*c[i+j];
cout << s;
return 0;
}*/
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, q, t, i, j;
long long s=0, m=LLONG_MAX;
vector<long long> b;
cin >> n >> q;
long long a[24]={0};
for (i=0; i<n; i++)
{
cin >> t;
a[t]=a[t]+1;
}
for (i=0; i<q; i++)
cin >> t >> t;
for (i=1; i<=23; i++)
if (a[i]!=0)
b.push_back(a[i]);
sort(b.begin(), b.end());
long long c[b.size()];
for (i=0; i<b.size()/2; i++)
c[i]=b[2*i];
for (i=0; i<b.size()/2; i++)
c[b.size()-1-i]=b[2*i+1];
if (b.size()%2==1)
c[b.size()/2]=b[b.size()-1];
long long memo[b.size()];
for (i=0; i<b.size(); i++)
memo[i]=c[i];
for (i=0; i<(1<<b.size()/2); i++)
{
for (j=0; j<b.size()/2; j++)
if (i&(1<<j))
swap(c[j], c[b.size()-1-j]);
s=0;
for (j=0; j<b.size(); j++)
s=s+c[j]+c[j]*(c[j]-1)/2;
for (j=1; j<b.size(); j++)
for (t=0; t+j<b.size(); t++)
s=s+(j+1)*c[t]*c[t+j];
m=min(s, m);
for (j=0; j<b.size(); j++)
c[j]=memo[j];
}
cout << m;
return 0;
}*/
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n, q, t, i, j;
long long s=0, m=LLONG_MAX;
vector<long long> b;
cin >> n >> q;
long long a[12]={0};
for (i=0; i<n; i++)
{
cin >> t;
a[t]=a[t]+1;
}
for (i=0; i<q; i++)
cin >> t >> t;
for (i=1; i<=11; i++)
if (a[i]!=0)
b.push_back(i);
do {
s=0;
for (i=0; i<b.size(); i++)
s=s+a[b[i]]+a[b[i]]*(a[b[i]]-1)/2;
for (j=1; j<b.size(); j++)
for (i=0; i+j<b.size(); i++)
s=s+(j+1)*a[b[i]]*a[b[i+j]];
m=min(s, m);
} while (next_permutation(b.begin(), b.end()));
cout << m;
return 0;
}*/
/*#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, q, t, i, j;
long long s=0, m=LLONG_MAX;
set<int> st;
cin >> n >> q;
int a[n];
for (i=0; i<n; i++)
cin >> a[i];
for (i=0; i<q; i++)
cin >> t >> t;
sort(a, a+n);
do {
s=0;
for (i=0; i<n; i++)
for (j=i+1; j<=n; j++)
{
st.clear();
for (t=i; t<j; t++)
st.insert(a[t]);
s=s+st.size();
}
m=min(m, s);
} while (next_permutation(a, a+n));
cout << m;
return 0;
}*/
Compilation message (stderr)
diversity.cpp: In function 'int main()':
diversity.cpp:36:15: warning: variable 'frequency' set but not used [-Wunused-but-set-variable]
36 | long long frequency[300001]={0}, compressed[n+1]={0};
| ^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |