#define fast ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#include <bits/stdc++.h>
using namespace std;
#define sqr 340
#define mid (l+r)/2
#define pb push_back
#define ppb pop_back
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define ins insert
#define era erase
#define C continue
#define mem(dp,i) memset(dp,i,sizeof(dp))
#define mset multiset
typedef long long ll;
typedef short int si;
typedef long double ld;
typedef pair<int,int> pi;
typedef pair<ll,ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<pi> vpi;
typedef vector<pll> vpll;
const ll inf=1e18*4;
const ld pai=acos(-1);
const int MX = 1e6+9;
ll n,q,ans;
ll H=1234577,po[MX];
ll a[MX],b[MX];
ll hasha[MX],hashb[MX];
ll p[MX],sz[MX];
map<ll,ll>num;
ll get(ll node){
if(p[node]==node)return node;
return p[node]=get(p[node]);
}
void add_nodes(ll seg,ll dif,ll N){
if(dif!=0){
ans+=seg*num[-dif]*N;
}
num[dif]+=seg*N;
}
void merge(ll a,ll b){
a=get(a);
b=get(b);
if(a==b)return ;
add_nodes(-1,hasha[a]-hashb[a],sz[a]);
add_nodes(-1,hasha[b]-hashb[b],sz[b]);
p[b]=a;
hasha[a]+=hasha[b];
hashb[a]+=hashb[b];
sz[a]+=sz[b];
add_nodes(1,hasha[a]-hashb[a],sz[a]);
}
void edit(int sgn, int u, int pos, int value) {
hashb[u] += sgn * po[pos];
hasha[u] += sgn * po[value];
sz[u] += sgn;
}
int main(){
cin>>n>>q;
po[0]=1;
for(ll i=1;i<=MX;i++)po[i]=po[i-1]*H;
for(ll i=0;i<n;i++)cin>>a[i],b[i]=a[i];
sort(b,b+n);
for(ll i=0;i<n;i++){
p[i]=i,sz[i]=1;
hasha[i]=po[a[i]];
hashb[i]=po[b[i]];
add_nodes(1,hasha[i]-hashb[i],1);
}
while(q--){
ll t;cin>>t;
if(t==1){
ll x,y;
cin>>x>>y;
x--,y--;
ll X=get(x);
ll Y=get(y);
if(X==Y){
swap(a[x],a[y]);
C;
}
add_nodes(-1,hasha[X]-hashb[X],sz[X]);
add_nodes(-1,hasha[Y]-hashb[Y],sz[y]);
edit(-1,X,x,a[x]);
edit(-1,Y,y,a[y]);
swap(a[x],a[y]);
edit(1,X,x,a[x]);
edit(1,Y,y,a[y]);
add_nodes(1,hasha[X]-hashb[X],sz[X]);
add_nodes(1,hasha[Y]-hashb[Y],sz[Y]);
}
else if(t==2){
ll x,y;
cin>>x>>y;
x--,y--;
merge(x,y);
}
else if(t==3){
if(num[0]==n)cout<<"DA"<<endl;
else cout<<"NE"<<endl;
}
else if(t==4){
cout<<ans<<endl;
}
}
}
Compilation message
zamjene.cpp: In function 'int main()':
zamjene.cpp:65:35: warning: iteration 1000008 invokes undefined behavior [-Waggressive-loop-optimizations]
for(ll i=1;i<=MX;i++)po[i]=po[i-1]*H;
~~~~~^~~~~~~~~~
zamjene.cpp:65:21: note: within this loop
for(ll i=1;i<=MX;i++)po[i]=po[i-1]*H;
~^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
11 ms |
8184 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
13 ms |
8312 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
11 ms |
8184 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
12 ms |
8184 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
12 ms |
8184 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
32 ms |
8824 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
241 ms |
13604 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
3040 ms |
50552 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
4393 ms |
99532 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
2812 ms |
65200 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |