Cod sursa(job #1412996)

Utilizator savulescustefanSavulescu Stefan savulescustefan Data 1 aprilie 2015 18:00:36
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <cstdio>

using namespace std;
int n,m,st,dr,Max,Max1,a[100004],b[70][100004],c[70],mi,i,j,p,y,z,q,aux;
bool ok;
char x;
int main()
{
    freopen ("marbles.in","r",stdin);
    freopen ("marbles.out","w",stdout);
    scanf ("%d %d", &n, &m);
    Max=0;
    for (i=1;i<=n;i++)
    {
        scanf ("%d %d", &a[i], &x);
        if (x>Max)
        Max=x;
        b[x][++c[x]]=a[i];
    }
    for (i=1;i<=m;i++)
    {
        scanf ("%d ", &p);
        scanf ("%c", &x);
        y=0;
        z=0;
        if (x=='-')
        {
            scanf ("%d ", &y);
            y*=-1;
        }
        else
        {
            while (x!=' ')
            {
                y*=10;
                y+=(x-'0');
                scanf ("%c", &x);
            }
        }
        scanf ("%c", &x);
        if (x=='-')
        {
            scanf ("%d ", &z);
            z*=-1;
        }
        else
        {
            while (x!='\n')
            {
                z*=10;
                z+=(x-'0');
                scanf ("%c", &x);
            }
        }
        if (p==1)
        {
            if (y>z)
            printf ("%d\n", 0);
            else
            {
            Max1=0;
            for (j=1;j<=Max;j++)
            {
                st=1;
                dr=c[j];
                while (st<=dr)
                {
                    mi=(st+dr)/2;
                    if (b[j][mi]>=y)
                    dr=mi-1;
                    else
                    st=mi+1;
                }
                q=st;
                st=1;
                dr=c[j];
                while (st<=dr)
                {
                    mi=(st+dr)/2;
                    if (b[j][mi]>z)
                    dr=mi-1;
                    else
                    st=mi+1;
                }
                st-=q;
                if (st>Max1)
                Max1=st;
            }
            printf ("%d\n", Max1);
            }
        }
        else
        {
            z=y+z;
            ok=false;
            for (j=1;j<=Max;j++)
            {
                st=1;
                dr=c[j];
                while (st<=dr)
                {
                    mi=(st+dr)/2;
                    if (b[j][mi]>y)
                    dr=mi-1;
                    else if (b[j][mi]<y)
                    st=mi+1;
                    else
                    {
                    ok=true;
                    break;
                    }
                }
                if (ok==true)
                break;
            }
            b[j][mi]=z;
        }
    }
    return 0;
}