SuitNdtie

General PROG1092

Mar 28th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.11 KB | None | 0 0
  1. #include<stdio.h>
  2. int general[100010];
  3.  
  4. int find(int x){
  5.     if(general[x] == x)return x;
  6.     return general[x] = find(general[x]);
  7. }
  8. void unions(int x,int y){
  9.     int gx = find(x);
  10.     int gy = find(y);
  11.     general[y] = gx;
  12. }
  13. bool isset(int x,int y){
  14.     return find(x) == find(y);
  15. }
  16.  
  17. int main()
  18. {
  19.     int n,m;
  20.     scanf("%d %d",&n,&m);
  21.     int soldiers[n+1];
  22.     for(int i=1;i<=n;i++)scanf("%d",&soldiers[i]);
  23.     for(int i=1;i<=n;i++)general[i] = i;
  24.    
  25.     for(int i=1;i<=m;i++){
  26.         int x,y;
  27.         scanf("%d %d",&x,&y);
  28.         if(isset(x,y)){
  29.             printf("-1\n");
  30.             continue;
  31.         }
  32.         int gx = find(x);
  33.         int gy = find(y);
  34.         if(soldiers[gx] > soldiers[gy]){ // x win
  35.             unions(gx,gy);
  36.             soldiers[gx] += soldiers[gy]/2;
  37.             printf("%d\n",gx);
  38.         }
  39.         else if(soldiers[gy] > soldiers[gx]){ // y win
  40.             unions(gy,gx);
  41.             soldiers[gy] += soldiers[gx]/2;
  42.             printf("%d\n",gy);
  43.         }
  44.         else{
  45.         //  printf("Test eq\n");
  46.             if(gx < gy){ // x win
  47.                 unions(gx,gy);
  48.                 soldiers[gx] += soldiers[gy]/2;
  49.                 printf("%d\n",gx);
  50.             }else{
  51.                 unions(gy,gx);
  52.                 soldiers[gy] += soldiers[gx]/2;
  53.                 printf("%d\n",gy);
  54.             }
  55.         }
  56.     }
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment