Cod sursa(job #3155924)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 10 octombrie 2023 10:48:38
Problema Heapuri cu reuniune Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#include <cstring>
#include <cstdio>
#pragma GCC optimize ("O3")
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define bminify(a,b)a=bmin(a,b)
#define bmaxify(a,b)a=bmax(a,b)
#define forq(i,ii,n)for(i=ii;i<n;i++)
#define f first
#define s second
#define mod 777777777ll
#define nmax 300001
#define DEBUG 1
using namespace std;
typedef long long ll;
//ifstream in("ghicit.in");
//ofstream out("cuba.out");
FILE *fin=fopen("nunta.in","r");
FILE *fout=fopen("nunta.out","w");
struct h{int v;h *d,*f;}e[nmax];
int n,q,i,j,k,l,x,y,c;h*m[101],*o[nmax];
inline h*r(h*a,h*b)
{
    if(a==0)return b;
    if(b==0)return a;
    if(a->v>b->v)
        {b->d=a->f,a->f=b;return a;}
        else{a->d=b->f,b->f=a;return b;}
}
int main()
{
scanf("%d%d",&n,&q);
while(q--)
{
    scanf("%d %d",&c,&x);
    if(c==3)
    {
        scanf("%d",&y);
        m[x]=r(m[x],m[y]);
        m[y]=0;
    }
    else if(c==1)
    {
        scanf("%d",&(e[++l].v));
        m[x]=r(m[x],&e[l]);
    }
    else{
        printf("%d\n",m[x]->v);
        if(m[x]->f)
        {
            j=0,o[0]=m[x]->f;
            while(o[j]->d)o[j+1]=o[j]->d,j++;
            for(i=0;i<j;i+=2)o[i]=r(o[i],o[i+1]);
            if(i!=j)i-=2;//j=3==>2,j=4=>4
            //printf("%dI\n",i);
            while(i>0)o[i-2]=r(o[i-2],o[i]),i-=2;
            o[0]->d=0,m[x]=o[0];
        }
        else m[x]=0;
    }
}
}