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;
typedef long long lo;
#define fi first
#define se second
#define endl "\n"
#define int long long
#define pb push_back
#define fio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define FOR for(int i=1;i<=n;i++)
#define mid ((start+end)/2)
#define ort ((bas+son)/2)
const lo inf = 1000000000;
const lo li = 500005;
const lo mod = 1000000007;
int n,m,a[li],k,flag,t,x[li],b[li],siz[li],tree[li*4];
int cev;
string s;
vector<int> vec[li];
vector<pair<int,int>> v;
map<pair<int,int>,int> calc;
inline void update(int node,int start,int end,int l,int r){
if(start>end || start>r || end<l)return ;
if(start>=l && end<=r){tree[node]+=1;return ;}
update(node*2,start,mid,l,r),update(node*2+1,mid+1,end,l,r);
tree[node]=tree[node*2]+tree[node*2+1];
}
inline int query(int node,int start,int end,int l,int r){
if(start>end || start>r || end<l)return 0;
if(start>=l && end<=r)return tree[node];
return query(node*2,start,mid,l,r)+query(node*2+1,mid+1,end,l,r);
}
int32_t main(void){
//~ freopen("at.txt","r",stdin);
//~ freopen("kat.txt","w",stdout);
scanf("%lld %lld %lld",&n,&k,&t);
FOR scanf("%lld",&a[i]);
for(int i=1;i<=k;i++)b[i]=i;
for(int i=1;i<=t;i++){
scanf("%lld",&x[i]);
v.pb({b[x[i]],b[x[i]+1]});
swap(b[x[i]],b[x[i]+1]);
}
FOR{
vec[a[i]].pb(i);
siz[a[i]]++;
}
for(auto go:v){
if(calc.find({go.fi,go.se})!=calc.end())continue;
//~ if(calc.find({go.se,go.fi})!=calc.end())continue;
int tut1=0,tut2=0;
int combo=0,combo2=0;
int res=0;
while(tut1<siz[go.fi] && tut2<siz[go.se]){
if(vec[go.fi][tut1]<vec[go.se][tut2]){
res+=combo2;
combo++;
tut1++;
}
else{
res+=combo;
combo2--;
tut2++;
}
}
//~ cout<<res<<" ()() "<<go.fi<<" ()() "<<go.se<<" ()() "<<tut1<<" ()() "<<tut2<<" ()() "<<combo<<endl;
if(tut1<siz[go.fi])res+=combo2*(siz[go.fi]-tut1);
else res+=combo*(siz[go.se]-tut2);
calc[{go.fi,go.se}]=res;
}
cev=0;
for(int i=n;i>=1;i--){
cev+=query(1,1,k,1,a[i]-1);
update(1,1,k,a[i],a[i]);
}
for(int i=1;i<=k;i++)b[i]=i;
for(int i=1;i<=t;i++){
int xx=b[x[i]];
int yy=b[x[i]+1];
//~ cout<<xx<<" :: "<<yy<<endl;
int at=0;
/*
* if(calc.find({xx,yy})!=calc.end())
*/
at=calc[{xx,yy}];
//~ else at=calc[{yy,xx}];
//~ cout<<at<<" ()() "<<endl;
cev+=at;
printf("%lld\n",cev);
swap(b[x[i]],b[x[i]+1]);
}
return 0;
}
Compilation message (stderr)
Main.cpp: In function 'int32_t main()':
Main.cpp:44:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
44 | scanf("%lld %lld %lld",&n,&k,&t);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:45:11: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
45 | FOR scanf("%lld",&a[i]);
| ~~~~~^~~~~~~~~~~~~~
Main.cpp:48:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
48 | scanf("%lld",&x[i]);
| ~~~~~^~~~~~~~~~~~~~
# | 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... |