Cod sursa(job #1490644)

Utilizator vladdy47Bucur Vlad Andrei vladdy47 Data 23 septembrie 2015 21:54:50
Problema Marbles Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
# include <cstdio>
# include <algorithm>
# include <cstring>
# define MAX (100000 + 5)
# define color (64 + 5)

using namespace std;

long long n, m, T, i, j, aux1, aux2, Max, dif;
long long max_v[MAX], NR[MAX][color], AUX1[color], AUX2[color];
pair <long long, int> A[MAX];

int cautbin(long long poz)
{
    int st = 1, dr = n, mij;
    bool ok = false;
    while (st <= dr)
    {
        mij = (st + dr) / 2;
        if (A[mij].first == poz)
        {
            ok = true;
            break;
        }
        else if (A[mij].first > poz) dr = mij - 1;
        else if (A[mij].first < poz) st = mij + 1;
    }
    if (ok == true) return mij;
    else
    {
        int i;
        for (i = 1; i <= n; i++)
            if (A[i].first > poz) return i;
    }
}
void sol1()
{
    Max = 0;
    aux1 = cautbin(i);
    aux2 = cautbin(j);
    memcpy(AUX1,NR[aux1],sizeof(NR[aux1]));
    memcpy(AUX2,NR[aux2],sizeof(NR[aux2]));

    int  maxy = max (max_v[aux1], max_v[aux2]);

    for (j = 1; j <= maxy; j++)
    {
        dif = AUX2[j] - AUX1[j];
        if (A[aux1].second == j) ++dif;
        Max = max(Max, dif);
    }

    if (Max > 0) printf("%lld\n",Max);
    else printf("0\n");
}

void sol2()
{
    aux1 = cautbin(i);
    A[aux1].first = i + j;
}

void ap()
{
    int i, j;
    for (i = 1; i <= n; i++)
    {
        for (j = 1; j <= n; j++)
            NR[i][j] = NR[i-1][j];
        NR[i][A[i].second]++;
    }
}
int main ()

{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);

    scanf("%d %d\n", &n, &m);

    for (i = 1; i <= n; i++)
    {
        scanf("%lld %lld\n", &A[i].first, &A[i].second);
        if (A[i].second > Max) Max = A[i].second;
        max_v[i] = Max;
    }

    sort (A + 1, A + n + 1);
    ap();

    for (int k = 1; k <= m; k++)
    {
        scanf("%lld %lld %lld\n",&T, &i, &j);

        if (T == 1) sol1();
        if (T == 0) sol2();
    }

    return 0;
}