Cod sursa(job #1259841)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 10 noiembrie 2014 17:24:01
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

struct bila
{
    int x, c;
}v[100005];

bool cmp(bila a, bila b)
{
    return a.x<b.x;
}

int n, m, x, y, i, j, p, u, mij, op, mx, a, b, r[67][100005];

int main()
{
    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].c);
    sort(v+1, v+n+1, cmp);

    for(j=1;j<=n;j++)
        for(i=1;i<=64;i++)
        {
            r[i][j]=r[i][j-1];
            if(v[j].c==i) r[i][j]++;
        }

    while(m--)
    {
        scanf("%d%d%d", &op, &x, &y);
        if(op==0)
        {
            p=1;u=n;
            while(p<=u)
            {
                mij=p+(u-p>>1);
                if(v[mij].x==x) break;
                if(v[mij].x>x) u=mij-1;
                else p=mij+1;
            }
            if(p<=u) v[mij].x+=y;
            continue;
        }
        p=1;u=n;a=0;
        while(p<=u)
        {
            mij=p+(u-p>>1);
            if(v[mij].x>=x)
            {
                a=mij;
                u=mij-1;
                continue;
            }
            p=mij+1;
        }

        p=1;u=n;b=0;
        while(p<=u)
        {
            mij=p+(u-p>>1);
            if(v[mij].x<=y)
            {
                b=mij;
                p=mij+1;
                continue;
            }
            u=mij-1;
        }

        mx=0;
        for(i=1;i<=64;i++)
        {
            x=r[i][b]-r[i][a-1];
            if(x>mx) mx=x;
        }
        printf("%d\n", mx);
    }
    return 0;
}