Cod sursa(job #1174937)

Utilizator geniucosOncescu Costin geniucos Data 24 aprilie 2014 11:18:01
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int tip,a,b,st,dr,i,j,p,u,mij,n,m,x[100009],y[100009],s[100009][65];
struct str
{
    int x,y;
}init[100009];
bool cmp(str a,str b)
{
    return a.x<b.x;
}
int ras(int x,int y)
{
    int i,maxi=0;
    if(x>y) return 0;
    for(i=1;i<=64;i++)
        if(s[y][i]-s[x-1][i]>maxi) maxi=s[y][i]-s[x-1][i];
    return maxi;
}
int main()
{
freopen("marbles.in","r",stdin);
freopen("marbles.out","w",stdout);
scanf("%d",&n);
scanf("%d",&m);
for(i=1;i<=n;i++)
{
    scanf("%d",&init[i].x);
    scanf("%d",&init[i].y);
}
sort(init+1,init+n+1,cmp);
for(i=1;i<=n;i++)
{
    x[i]=init[i].x;
    y[i]=init[i].y;
}
for(i=1;i<=n;i++)
    for(j=1;j<=64;j++)
        s[i][j]=s[i-1][j]+(y[i]==j);
for(i=1;i<=m;i++)
{
    scanf("%d",&tip);
    if(tip==0)
    {
        scanf("%d",&a);
        scanf("%d",&b);
        p=1;
        u=n;
        while(p<=u)
        {
            mij=(p+u)>>1;
            if(x[mij]==a) break;
            if(x[mij]<a) p=mij+1;
            else u=mij-1;
        }
        x[mij]+=b;
    }
    else
    {
        scanf("%d",&a);
        scanf("%d",&b);
        p=1;
        u=n;
        st=n+1;
        while(p<=u)
        {
            mij=(p+u)>>1;
            if(x[mij]>=a)
            {
                st=mij;
                u=mij-1;
            }
            else p=mij+1;
        }
        p=1;
        u=n;
        dr=n+1;
        while(p<=u)
        {
            mij=(p+u)>>1;
            if(x[mij]<=b)
            {
                dr=mij;
                p=mij+1;
            }
            else u=mij-1;
        }
        if(dr==n+1||st==n+1){printf("0\n");continue;}
        printf("%d\n",ras(st,dr));
    }
}
return 0;
}