Cod sursa(job #163545)

Utilizator CezarMocanCezar Mocan CezarMocan Data 22 martie 2008 14:46:07
Problema Marbles Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda Finala, Clasele 5-8 Marime 2.1 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct bila{long a; long b;};

int n,m,q,a,b,x[100010][66],i,j,p1,p2,p,mx;
bila v[100010];

bool cmp(bila x, bila y)
    {
    if (x.a<y.a)
        return true;
    else
        return false;  
    }
    
long poz(long t,long l,long r)
    {
    long m;
    m=(l+r)/2;
    if (v[m].a==t)  
        return m;
    if (l>=r)
        return 0;
    if (t<v[m].a)   
        return poz(t,l,m-1);
    else
        return poz(t,m+1,r);    
    }

long poz1(long t, long l, long r)
    {
    //pentru ala din stanga
    long m;
    m=(l+r)/2;
    if ((v[m].a>=t)&&(v[m-1].a<t))
        return m; 
    if (l>=r)
        return 0;   
    if (v[m].a>t)
        return poz1(t,l,m-1);
    if (v[m].a<t)
        return poz1(t,m+1,r);
    }


long poz2(long t, long l, long r)
    {
    //pentru ala din dreapta
    long m;
    m=(l+r)/2;
    if ((v[m].a<=t)&&(v[m+1].a>t))
        return m; 
    if (l>=r)
        return 0;                                                               
    if (v[m].a>t)
        return poz2(t,l,m-1);
    if (v[m].a<t)
        return poz2(t,m+1,r);
    }


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,&b);
    v[i].a=a;
    v[i].b=b;             
    }
sort(v+1,v+n+1,cmp);
v[n+1].a=1<<31-1;
x[1][v[1].b]=1;
for (i=2;i<=n;i++)
    {
    for (j=1;j<=64;j++)
        x[i][j]=x[i-1][j];
    x[i][v[i].b]++;    
    }
    
for (i=1;i<=m;i++)
    {
    scanf("%d%d%d",&q,&a,&b);
    if (q==0)
        {
        p=poz(a,1,n);    
        v[p].a=v[p].a+b;
        }    
    if (q==1)
        if ((a<=v[n].a)&&(b>=v[1].a))
            {
            p1=poz1(a,1,n);
            p2=poz2(b,1,n);
//        printf("%d %d ",p1,p2);
            mx=0;
            for (j=1;j<=64;j++)
                  if ((x[p2][j]-x[p1-1][j])>mx)
                    mx=x[p2][j]-x[p1-1][j];
            printf("%d\n",mx);
            }
        else
            printf("0\n");
    }
}