Cod sursa(job #85376)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 21 septembrie 2007 12:18:27
Problema Elimin Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <stdio.h>
#define TMAX (1<<20)

char buff[9500010];
int N, M, T[2*TMAX], K[2*TMAX], V[TMAX], P, Q, Max, Pmax, X;
FILE *f;

void read()
{
        int i;
        f = fopen("elimin.in", "r");
        setbuffer(f, buff, sizeof(buff));
        fscanf(f, "%d %d", &N, &M);
        for (i = 1; i <= N; i++)
            fscanf(f,"%d",V+i);
}

void update(int x, int val)
{
        int nod = TMAX+x, l;

        T[nod] = x;
        K[nod] = 1;
        if (val<0) K[nod] = 0;
        while (nod>1)
        {
                nod = nod>>1;
                l = nod<<1;
                T[nod] = T[l];
                if (V[ T[l] ] < V[ T[l+1] ]) T[nod] = T[l+1];
                K[nod] += val;
        }
}

void query(int p, int q, int nod)
{
        int md = (p+q)>>1, l = nod<<1;

        if (P <= p && q <= Q)
        {
                if (V[ T[nod] ]>Max) Max = V[ T[nod] ], Pmax = T[nod];
                return;
        }

        if ( (p<=P&&P<=q) || (p<=Q&&Q<=q) )
        {
                query(p,md,l);
                query(md+1,q,l+1);
        }
}

void getnew(int x, int p, int q, int nod)
{
        int md = (p+q)>>1, l = nod<<1;

        if (p==q) { X = p; return; }
        if (K[l]==x) { X = md; return; }

        if (K[l]>x) getnew(x,p,md,l);
        if (K[l]<x) getnew(x-K[l],md+1,q,l+1);

        if (X>=0) return;
}

void solve()
{
        int i, j;

        for (i = 1; i <= N; i++) update(i,1);
        while (M--)
        {
                fscanf(f,"%d%d",&i,&j);
                X = -1; getnew(i,0,TMAX-1,1); P = X;
                X = -1; getnew(j,0,TMAX-1,1); Q = X;
                Max = 0; Pmax = -1;
                query(0,TMAX-1,1);
                V[Pmax] = -1;
                update(Pmax,-1);
        }
}

void write()
{
        int i;
        freopen("elimin.out", "w", stdout);
        for (i = 1; i <= N; i++)
            if (V[i]>=0) printf("%d\n", V[i]);
}

int main()
{
        read();
        solve();
        write();
        return 0;
}