Cod sursa(job #1174977)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 24 aprilie 2014 11:52:24
Problema Marbles Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 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[65][1000002];
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=0;
    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);
    v[n+1].x=9999999;
    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&&v[k-1].x<x)
                {
                    x1=k;
                    break;
                }
                else if(v[k].x>=x) u=k-1;
                else p=k+1;
            }
            if(x1==0)
            {
                printf("0\n");
            }
            else
            {
                p=1;
                u=n;
                while(p<=u)
                {
                    k=(p+u)/2;
                    if(v[k].x<=y&&v[k+1].x>y)
                    {
                        yy=k;
                        break;
                    }
                    else if(v[k].x<=y) p=k+1;
                    else u=k-1;
                }
                if(yy==0)
                {
                    printf("0\n");
                }
                else
                {
                    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;
}