Cod sursa(job #1175016)

Utilizator DanielRusuDaniel Rusu DanielRusu Data 24 aprilie 2014 12:44:22
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <cstdio>
#include <algorithm>

using namespace std;

FILE *fin = fopen("marbles.in","r");
FILE *fout = fopen("marbles.out","w");

int n, m, mat[65][100010], i, j, cul, mxcul, poz, tip, x, y, mx, a, b, v[100010], nr, l;

void sortare(int line);
int bin_search(int line, int in, int sf, int val);

int main() {
    fscanf(fin, "%d %d", &n, &m);

    for(i = 1;i <= n;i++) {
        fscanf(fin, "%d %d", &poz, &cul);

        mxcul = max(mxcul, cul);

        mat[cul][0]++;
        mat[cul][mat[cul][0]] = poz;
    }

    for(i = 1;i <= mxcul;i++) {
        sortare(i);
    }

    for(l = 1;l <= m;l++) {
        fscanf(fin, "%d %d %d", &tip, &x, &y);

        if(tip == 0) {
            for(j = 1;j <= mxcul;j++) {
                poz = bin_search(j, 1, mat[j][0], x);

                if(mat[j][poz] == x) {
                    mat[j][poz] += y;

                    sortare(j);

                    break;
                }
            }
        }
        else {
            mx = poz = 0;

            for(j = 1;j <= mxcul;j++) {
                a = bin_search(j, 1, mat[j][0], x);
                b = bin_search(j, 1, mat[j][0], y);

                while(mat[j][a] < x) a++;
                while(mat[j][b] < y) b++;

                if(mx < b - a + 1) {
                    mx = b - a + 1;
                    poz = j;
                }
            }

            fprintf(fout, "%d\n", mx);
        }
    }
}

void sortare(int line) {
    nr = 0;

    for(i = 1;i <= mat[line][0];i++) {
        v[++nr] = mat[line][i];
    }

    sort(v + 1, v + 1 + nr);

    for(i = 1;i <= mat[line][0];i++) {
        mat[line][i] = v[i];
    }
}

int bin_search(int line, int in, int sf, int val) {
    int mij;

    if(sf - in <= 1) return sf;
    if(mat[line][1] > val) return 1;
    if(mat[line][mat[line][0]] < val) return mat[line][0];

    mij = (in + sf) / 2;

    if(mat[line][mij] == val) return mij;

    if(mat[line][mij] < val) return bin_search(line, mij + 1, sf, val);
    return bin_search(line, in, mij - 1, val);
}