Cod sursa(job #1412975)

Utilizator andru47Stefanescu Andru andru47 Data 1 aprilie 2015 17:58:41
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>
#define f first
#define s second
using namespace std;
long long n,m,i,instr,ii,j,Max,maxy,x1,x2,dif,I;
unsigned int nr[100005][66],V[66],V2[66],v[100005];
pair <long long,int>a[100005];
inline int cautare(long long poz)
{
    int st,dr,mij,i;
    bool ok=false;
    st=1;
    dr=n;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (a[mij].f>poz)dr=mij-1;
        else if (a[mij].f<poz)st=mij+1;
        else
        {
            ok=true;
            break;
        }
    }
    if (ok==true)return mij;
    else
    {
        for (i=1; i<=n; i++)
            if (a[i].f>poz)return i;
    }
}
int main()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);
    scanf("%lld %lld",&n,&m);
    for (i=1; i<=n; i++)
    {
        scanf("%lld %d\n",&a[i].f,&a[i].s);
        if (a[i].s>maxy)maxy=a[i].s;
        v[i]=maxy;
    }
    sort(a+1,a+n+1);
    for (i=1; i<=n; i++)
    {
        memcpy(nr[i],nr[i-1],sizeof(nr[i-1]));
        nr[i][a[i].s]++;
    }
    for (i=1; i<=m; i++)
    {
        scanf("%lld %lld %lld\n",&instr,&ii,&j);
        if (instr==1)
        {
            x1=cautare(ii);
            x2=cautare(j);
            Max=0;
            memcpy(V,nr[x1],sizeof(nr[x1]));
            memcpy(V2,nr[x2],sizeof(nr[x2]));
            if (a[x2].f!=j)V2[a[x2].s]--;
            // if (a[x2].f!=j)V2[a[x2].s]--;
            for (I=1; I<=max(v[x1],v[x2]); I++)
            {
                dif=V2[I]-V[I];
                if (a[x1].s==I)dif++;
                Max=max(dif,Max);
            }
            if (Max>0) printf("%lld\n",Max);
            else printf("0\n");
        }
        else
        {
            x1=cautare(ii);
            a[x1].f=ii+j;
        }
    }
    return 0;
}