Cod sursa(job #449423)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 6 mai 2010 12:34:36
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

#define maxim(a,b) (a>b ? a : b)

int sol,n,m,c,nr;
int d[100002][67];
char s[104];

struct pereche
{
    int x,y;
};
pereche q[100006];

int cmp(const pereche& a,const pereche& b)
{
    return (a.x<b.x);
}

int main ()
{
    int i,j,st,dr,mij,a;
    int sol1,sol2,b,tip;
    int semn;
    
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++)
    {
        gets(s);
        nr=strlen(s);
        st=0;a=0;b=0;
        for(j=0;j<nr;j++)
        {
            if(s[j]==' ')
            {
                st=1;
                continue;
            }
            if(!st)
                a=a*10+s[j]-'0';
            else
                b=b*10+s[j]-'0';
        }
        c=maxim(c,b);
        q[i].x=a;
        q[i].y=b;
    }
    sort(q+1,q+n+1,cmp);
    for(i=1;i<=n;i++)
        for(j=1;j<=c;j++)
            if(q[i].y==j)
                d[i][j]=d[i-1][j]+1;
            else
                d[i][j]=d[i-1][j];
    for(i=1;i<=m;i++)
    {
        gets(s);
        nr=strlen(s);
        tip=s[0]-'0';
        st=0;a=0;b=0;semn=1;
        for(j=2;j<nr;j++)
        {
            if(s[j]=='-')
            {
                semn=-1;
                continue;
            }
            if(s[j]==' ')
            {
                st=1;
                a*=semn;
                semn=1;
                continue;
            }
            if(!st)
                a=a*10+s[j]-'0';
            else
                b=b*10+s[j]-'0';
        }
        b*=semn;
        if(!tip)
        {
            st=1;dr=n;
            while(st<=dr)
            {
                mij=(st+dr)/2;
                if(q[mij].x<a)
                    st=mij+1;
                else
                    if(q[mij].x>a)
                        dr=mij-1;
                    else
                        break;
            }
            if(st<=dr)
                q[mij].x+=b;
            continue;
        }
        st=1;dr=n;
        a--;
        sol1=0;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(q[mij].x<=a)
            {
                st=mij+1;
                sol1=mij;
            }
            else
                dr=mij-1;
        }
        sol2=0;
        st=sol1;dr=n;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(q[mij].x<=b)
            {
                st=mij+1;
                sol2=mij;
            }
            else
                dr=mij-1;
        }
        sol=0;
        for(j=1;j<=c;j++)
            sol=maxim(sol,d[sol2][j]-d[sol1][j]);
        printf("%d\n",sol);
    }

    return 0;
}