Cod sursa(job #1211582)

Utilizator catalinrebegeaUNIBUC-Claudia Catarig catalinrebegea Data 22 iulie 2014 21:19:37
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <cstdio>
#include <algorithm>
#define Nmax 100005

using namespace std;

struct bila
{
    int x,cul;
    bool operator <(const bila A) const
    {
        return x<A.x;
    }
};
bila v[Nmax];
int s[65][Nmax],N;

inline int BS0(int x)
{
    int st=1,dr=N,mij;
    while(st<=dr)
    {
        mij=((st+dr)>>1);
        if(v[mij].x==x)
            return mij;
        if(v[mij].x<x)
            st=mij+1;
        else
            dr=mij-1;
    }
}

inline int BS1(int x)
{
    int st=1,dr=N,mij,sol=-1;
    while(st<=dr)
    {
        mij=((st+dr)>>1);
        if(v[mij].x>=x)
        {
            sol=mij;
            dr=mij-1;
        }
        else
            st=mij+1;
    }
    return sol;
}

inline int BS2(int x)
{
    int st=1,dr=N,mij,sol=-1;
    while(st<=dr)
    {
        mij=((st+dr)>>1);
        if(v[mij].x<=x)
        {
            sol=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    return sol;
}

int main()
{
    int M,i,j,tip,x,y,p1,p2,sol;
    freopen ("marbles.in","r",stdin);
    freopen ("marbles.out","w",stdout);
    scanf("%d%d", &N,&M);
    for(i=1;i<=N;++i)
        scanf("%d%d", &v[i].x,&v[i].cul);
    sort(v+1,v+N+1);
    for(i=1;i<=64;++i)
        for(j=1;j<=N;++j)
            s[i][j]=s[i][j-1]+(v[j].cul==i);
    while(M--)
    {
        scanf("%d%d%d", &tip,&x,&y);
        if(!tip)
            v[BS0(x)].x=x+y;
        else
        {
            p1=BS1(x); p2=BS2(y); sol=0;
            if(p1!=-1 && p2!=-1)
                for(i=1;i<=64;++i)
                    sol=max(sol,s[i][p2]-s[i][p1-1]);
            printf("%d\n", sol);
        }
    }
    return 0;
}