Cod sursa(job #1787670)

Utilizator giotoPopescu Ioan gioto Data 24 octombrie 2016 21:30:25
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define f first
#define s second
using namespace std;

int tip, n, m, x, c;
int i1, i2;
int f[65];
vector<pair <int, int> > v;
inline int CBIN1(int i3){
    int st = 0, dr = n - 1;
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(v[mid].f >= i3)
            dr = mid - 1;
        if(v[mid].f < i3)
            st = mid + 1;
    }
    return st;
}
inline int CBIN2(int i3){
    int st = 0, dr = n - 1;
    while(st <= dr){
        int mid = (st + dr) / 2;
        if(v[mid].f > i3)
            dr = mid - 1;
        if(v[mid].f <= i3)
            st = mid + 1;
    }
    return dr;
}
int main()
{
    freopen("marbles.in", "r", stdin);
    freopen("marbles.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n ; ++i){
        scanf("%d%d", &x, &c);
        v.push_back(make_pair(x, c));
    }
    sort(v.begin(), v.end());
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d%d", &tip, &i1, &i2);
        if(tip == 0){
            int P = CBIN1(i1);
            v[P].f = v[P].f + i2;
            continue ;
        }
        int P1 = CBIN1(i1), P2 = CBIN2(i2);
        int Sol = 0;
        for(int j = P1; j <= P2 ; ++j){
            ++f[v[j].s];
            if(Sol < f[v[j].s])
                Sol = f[v[j].s];
        }
        printf("%d\n", Sol);
        for(int j = P1; j <= P2 ; ++j)
            f[v[j].s] = 0;
    }
    return 0;
}