Cod sursa(job #1174971)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 24 aprilie 2014 11:44:45
Problema Marbles Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("marbles.in");
ofstream g("marbles.out");
long n,i,j,t,val,el1,el2,maxx,val2,m,c[65][100001],st,dr,mij;
struct ab{
    long x,y;
};
ab v[100001];
int comp(ab a,ab b)
{
    if (a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}
int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
        f>>v[i].x>>v[i].y;
    sort(v+1,v+n+1,comp);
    for (i=1;i<=n;i++)
        for (j=1;j<=64;j++)
            if (v[i].y==j)
                c[j][i]=c[j][i-1]+1;
            else
                c[j][i]=c[j][i-1];
    for (i=1;i<=m;i++)
    {
        f>>t>>val>>val2;
        if (t==0)
        {
            st=1;
            dr=n;
            mij=(st+dr)/2;
            while (v[mij].x!=val)
            {
                if (v[mij].x>val)
                    dr=mij-1;
                else
                    st=mij+1;
                mij=(st+dr)/2;
            }
            v[mij].x+=val2;
        }
        else
        {
            st=1;
            dr=n;
            mij=(st+dr)/2;
            while (v[mij].x!=val && st<dr)
            {
                if (v[mij].x>val)
                    dr=mij-1;
                else
                    st=mij+1;
                mij=(st+dr)/2;
            }
            if (v[dr].x>=val)
                el1=dr;
            else
                el1=dr+1;
            st=1;
            dr=n;
            mij=(st+dr)/2;
            while (v[mij].x!=val2 && st<dr)
            {
                if (v[mij].x>val2)
                    dr=mij-1;
                else
                    st=mij+1;
                mij=(st+dr)/2;
            }
            if (v[dr].x<=val2)
                el2=dr;
            else
                el2=dr-1;
            el1--;
            maxx=0;
            for (j=1;j<=64;j++)
                if (c[j][el2]-c[j][el1]>maxx)
                    maxx=c[j][el2]-c[j][el1];
            g<<maxx<<'\n';

        }

    }
    f.close();
    g.close();
    return 0;
}