Cod sursa(job #164383)

Utilizator savimSerban Andrei Stan savim Data 24 martie 2008 09:11:44
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <stdio.h>
int max,p1,p2,x,y,p,q,i,j,k,n,m,r;
int a[100010][2],b[100010][2];
int v[100010][65];
void inter(int p, int q)
{
    int r=(p+q)/2,k=0,x=p,y=r+1,i;

    while (x<=r && y<=q)
    {
        k++;
        if (a[x][0]<a[y][0])
        {
            b[k][0]=a[x][0];
            b[k][1]=a[x][1];
            x++;
        }
        else
        {
            b[k][0]=a[y][0];
            b[k][1]=a[y][1];
            y++;
        }
    }
    while (x<=r)
    {
        k++;
        b[k][0]=a[x][0];
        b[k][1]=a[x][1];
        x++;
    }

    while (y<=q)
    {
        k++;
        b[k][0]=a[y][0];
        b[k][1]=a[y][1];
        y++;
    }

    k=0;
    for (i=p; i<=q; i++)
    {
        k++;
        a[i][0]=b[k][0];
        a[i][1]=b[k][1];
    }

}
void merge(int p, int q)
{
    int r=(p+q)/2;
    if (p==q) return;
    merge(p,r);
    merge(r+1,q);
    inter(p,q);
}
int main()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);

    scanf("%d%d",&n,&m);
    for (i=1; i<=n; i++)
        scanf("%d %d",&a[i][0],&a[i][1]);

    merge(1,n);

    for (i=1; i<=n; i++)
    {
        for (j=1; j<=64; j++)
            v[i][j]=v[i-1][j];
        v[i][a[i][1]]++;
    }

    for (i=1; i<=m; i++)
    {
        scanf("%d %d %d",&k,&x,&y);
        if (k==0)
        {
            p=0;q=n+1;
            while (p+1<q)
            {
                r=(p+q)/2;
                if (a[r][0]>x) q=r;
                else if (a[r][0]<x)p=r;
                     else break;
            }
            a[r][0]=a[r][0]+y;
        }
        else
        {
            if (x>y)
            {
                p=x;x=y;y=p;
            }
            p1=1;p=0;q=n+1;
            while (p+1<q)
            {
                r=(p+q)/2;
                if (a[r][0]>=x)
                {
                    q=r;
                    p1=r;
                }
                else if (a[r][0]<x) p=r;
            }

            p2=n;p=0;q=n+1;
            while (p+1<q)
            {
                r=(p+q)/2;
                if (a[r][0]<=y)
                {
                    p=r;
                    p2=r;
                }
                else if (a[r][0]>y) q=r;
            }
            p1--;max=0;
            for (j=1; j<=64; j++)
                if (v[p2][j]-v[p1][j]>max) max=v[p2][j]-v[p1][j];
            printf("%d\n",max);
        }
    }


    return 0;
}