Cod sursa(job #1226499)

Utilizator paunmatei7FMI Paun Matei paunmatei7 Data 5 septembrie 2014 19:06:17
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>

#define x first
#define y second
#define NMAX 100007
#define CMAX 67

using namespace std;

vector < pair < int, int > > v;
int Sum[CMAX][NMAX];
int Maxc = 0, n, m;
int c[NMAX], Color[NMAX];

inline int cb(int val){
    int st = 1, dr = n, med;
    while(st <= dr){
        int med = (st + dr) >> 1;
        if(c[med] == val)
            return med;
        if(c[med] < val)
            st = med + 1;
        else
            dr = med - 1;
    }
    while(c[st] > val)
        --st;
    return st + 1;
}


int main(){
    freopen("marbles.in", "r", stdin);
    freopen("marbles.out", "w", stdout);
    scanf("%d %d", &n, &m);
    for(int i = 1; i <= n; ++i){
        int a, b;
        scanf("%d %d", &a, &b);
        v.push_back(make_pair(a, b));
        Maxc = max(Maxc, b);
    }
    sort(v.begin(), v.end());
    for(int i = 0; i < v.size(); ++i){
        c[i + 1] = v[i].x;
        Color[i + 1] = v[i].y;
    }
    for(int i = 1; i <= Maxc; ++i)
        for(int j = 1; j <= n; ++j){
            Sum[i][j] = Sum[i][j - 1];
            if(Color[j] == i)
                ++Sum[i][j];
        }
    for(int i = 1; i <= m; ++i){
        int a, b, Tip;
        scanf("%d %d %d", &Tip, &a, &b);
        if(Tip == 0){
            int poz = cb(a);
            c[poz] = a + b;
        }
        else{
            int poz = cb(a);
            int poz2 = cb(b), Ans = 0;
            for(int j = 1; j <= Maxc; ++j)
                Ans = max(Ans, Sum[j][poz2] - Sum[j][poz - 1]);
            printf("%d\n", Ans);
        }
    }
    return 0;
}