Cod sursa(job #1401439)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 25 martie 2015 21:23:13
Problema Paduri de multimi disjuncte Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>
int t[100001],s[100001],v[100001],z[100001],f[100001];
int radacina(int x)
{
    if(t[x]==0)
        return x;
    t[x]=radacina(t[x]);
    return t[x];
}
int gasire(int x)
{
    int rx=radacina(x);
    return s[rx];
}
int unificare(int x,int y)
{
    int rx=radacina(x);
    int ry=radacina(y);
    t[rx]=ry;
    s[ry]+=s[rx];
}
int main()
{
    int n,k,i,x;
    char c;
    FILE *fin=fopen("ruine.in","r");
    FILE *fout=fopen("ruine.out","w");
    fscanf(fin,"%d%d",&n,&k);
    for(i=1; i<=n; i++)
        fscanf(fin,"%d",&s[i]);
    fgetc(fin);
    for(i=1; i<=k; i++)
    {
        c=fgetc(fin);
        fgetc(fin);
        fscanf(fin,"%d",&x);
        fgetc(fin);
        v[i]=x;
        if(c=='T')
            z[i]=1;
        else{
            z[i]=2;
            f[v[i]]=1;
        }
    }
    for(i=1; i<n; i++)
        if(f[i]==0)
          unificare(i,i+1);
    for(i=k; i>0; i--)
    {
        if(z[i]==1)
            fprintf(fout,"%d\n",gasire(v[i]));
        else
            unificare(v[i],v[i+1]);
    }
    fclose(fin);
    fclose(fout);

    return 0;
}