Cod sursa(job #1174990)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 24 aprilie 2014 12:02:15
Problema Marbles Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2 kb
#include <cstdio>
#include <algorithm>

using namespace std;
struct qq
{
    int x, c;
}v[100005];
int n, m, x, y, op, maxx, c, j, x1, yy, i, p, u, k, a[66][100002];
bool compp(qq a, qq b)
{
    return a.x<b.x;
}
int main()
{
    freopen("marbles.in", "r", stdin);
    freopen("marbles.out", "w", stdout);
    scanf("%d%d", &n, &m);
    c=64;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d", &v[i].x, &v[i].c);
        if(v[i].c>c) c=v[i].c;
    }
    sort(v+1,v+n+1,compp);
    for(i=1;i<=n;i++)
        for(j=1;j<=c;j++)
            if(v[i].c==j) a[j][i]=a[j][i-1]+1;
            else a[j][i]=a[j][i-1];
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d", &op, &x, &y);
        if(op==0)
        {
            p=1;
            u=n;
            while(p<=u)
            {
                k=(p+u)/2;
                if(v[k].x==x)
                    break;
                else if(v[k].x>k) u=k-1;
                else p=k+1;
            }
            v[k].x+=y;
        }
        else
        {
            p=1;
            u=n;
            x1=0;
            yy=0;
            while(p<=u)
            {
                k=(p+u)/2;
                if(v[k].x>=x)
                {
                    x1=k;
                    u=k-1;
                }
                else p=k+1;
            }
            if(x1==0)
            {
                printf("0\n");
                continue;
            }
            p=1;
            u=n;
            while(p<=u)
            {
                k=(p+u)/2;
                if(v[k].x<=y)
                {
                    yy=k;
                    p=k+1;
                }
                else u=k-1;
            }
            if(yy==0)
            {
                printf("0\n");
                continue;
            }
            maxx=0;
            for(j=1;j<=c;j++)
                if(a[j][yy]-a[j][x1-1]>maxx) maxx=a[j][yy]-a[j][x1-1];
            printf("%d\n", maxx);
        }
    }
    return 0;
}