Cod sursa(job #158226)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 13 martie 2008 15:39:23
Problema Heavy metal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <vector>

using namespace std;

vector <int> w,q,b;
int n,m;

void citire()
{
    freopen("heavymetal.in","r",stdin);
    scanf("%d", &n);
    int a,s;
    m=0;
    w.push_back(0);
    q.push_back(0);
    for (int i=1; i<=n; i++)
    {
        scanf("%d%d", &a, &s);
        w.push_back(a);
        q.push_back(s);
        if (s>m)
            m=s;
    }
    fclose(stdin);
}

void rezolvare()
{
    b.push_back(0);
    int j=1;
    for (int i=1; i<=m; i++)
    {
        b.push_back(b[i-1]);
        /*for (int j=1; j<=n; j++)
            if (q[j]==i)
                if (b[i]<b[w[j]]+(q[j]-w[j]))
                    b[i]=b[w[j]]+(q[j]-w[j]);*/
        while (q[j]==i)
        {
            if (b[i]<b[w[j]]+(q[j]-w[j]))
                b[i]=b[w[j]]+(q[j]-w[j]);
            j++;
        }
    }
}

void sortare(int st, int dr)
{
    int x=q[(st+dr)/2];
    int i=st, aux;
    int j=dr;
    do
    {
        while (q[i]<x)
            ++i;
        while (q[j]>x)
            --j;
        if (i<=j)
        {
            aux=q[i];
            q[i]=q[j];
            q[j]=aux;
            aux=w[i];
            w[i++]=w[j];
            w[j--]=aux;
        }
    }
    while (i<=j);
    if (st<j)
        sortare(st,j);
    if (i<dr)
        sortare(i,dr);
}

int main()
{
    citire();
    sortare(1,n);
    rezolvare();
    freopen("heavymetal.out","w",stdout);
    printf("%d\n",b[m]);
    fclose(stdout);
    return 0;
}