Cod sursa(job #919406)

Utilizator apopeid13Apopeid Alejandro apopeid13 Data 19 martie 2013 17:13:27
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <fstream>
#include <algorithm>
#include <cstring>
 
using namespace std;
 
typedef struct {
    int coord;
    int culoare;
} lol;
 
int N, M;
lol v[100005];
int sol[100005][65];
char pars[50];
 
ifstream fin ("marbles.in");
 
inline int cmp (lol a, lol b) {
    return (a.coord < b.coord);
}
 
void Citire () {
    fin >> N >> M;
    int u, pff;
    fin.getline (pars, 10);
    for (int i = 0; i < N; i++)
    {
        fin.getline (pars, 48);
        u = 0;
        pff = 1;
        if (pars[0] == '-') u++, pff = -1;
        for (; pars[u] >= '0' && pars[u] <= '9'; u++)
        {
            v[i].coord = v[i].coord * 10 + pff * (pars[u] - '0');
        }
        u++;
        for (; pars[u] >= '0' && pars[u] <= '9'; u++)
        {
            v[i].culoare = v[i].culoare * 10 + pars[u] - '0';
        }
    }
    sort (v, v + N, cmp);
    sol[0][v[0].culoare] = 1;
    for (int i = 1; i < N; i++)
    {
        memcpy (sol[i], sol[i - 1], sizeof (sol[i - 1]));
        sol[i][v[i].culoare]++;
    }
}
 
inline int B_Search (int val) {
    int i, step = 1 << 20;
    for (i = 0; step; step >>= 1)
        if (i + step < N && v[i + step].coord <= val) i += step;
    return i;
}
 
void Business () {
    ofstream fout ("marbles.out");
    int a, b, c, dog, dog2, mare, y, pff;
    for (int i = 0; i < M; i++)
    {
        fin.getline (pars, 40);
         
        a = pars[0] - '0';
        b = 0;
        c = 0;
        pff = 1;
        y = 2;
        if (pars[2] == '-') pff = -1, y++;
         
        for (; pars[y] >= '0' && pars[y] <= '9'; y++)
            b = b * 10 + pff * (pars[y] - '0');
         
        y++;
        pff = 1;
        if (pars[y] == '-') pff = -1, y++;
        for (; pars[y] >= '0' && pars[y] <= '9'; y++)
            c = c * 10 + pff * (pars[y] - '0');
         
        if (a)
        {
            mare = 0;
            dog = B_Search (b);
            if (v[dog].coord < b) dog++;
            dog2 = B_Search (c);
            for (int u = 1; u <= 64; u++)
            {
                mare = max (mare, sol[dog2][u] - sol[dog - 1][u]);
            }
            fout << mare << "\n";
        }
        else
        {
            dog = B_Search (b);
            v[dog].coord += c;
        }
    }
    fin.close ();
    fout.close ();
}
 
int main () {
    Citire ();
    Business ();
    return 0;
}