Cod sursa(job #2519311)

Utilizator radugheoRadu Mihai Gheorghe radugheo Data 7 ianuarie 2020 16:08:36
Problema Marbles Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin  ("marbles.in");
ofstream fout ("marbles.out");

int n, m, x, y, maxcul, sol, cerinta, st, dr;
int d[65][200005];

pair <int, int> v[200005];

void cautBin (int i, int j){
    int st, dr, mid;
    st = 1, dr = n;
    while (st <= dr){
        mid = st + (dr - st)/2;
        if (v[mid].first > i){
            dr = mid - 1;
        }
        if (v[mid].first < i){
            st = mid + 1;
        }
        if (v[mid].first == i){
            v[mid].first = i + j;
        }
    }
}

int poz (int a){
    int st, dr, mid;
    st = 1, dr = n;
    while (st <= dr){
        mid = st + (dr - st)/2;
        if (v[mid].first < a){
            st = mid + 1;
        }
        else{
            dr = mid - 1;
        }
    }
    return st;
}

int main(){
    fin >> n >> m;
    for (int i=1; i<=n; i++){
        fin >> x >> y;
        v[i] = {x, y};
        maxcul = max (maxcul, y);
    }
    sort (v + 1, v + n + 1);
    for (int i=1; i<=n; i++){
        for (int j=1; j<=maxcul; j++){
            d[j][i] = d[j][i-1] + (v[i].second == j);
        }
    }
    for (int i=1; i<=m; i++){
        fin >> cerinta >> x >> y;
        if (cerinta == 0){
            cautBin (x, y);
        }
        else{
            st = poz (x) - 1, dr = poz (y+1) - 1;
            sol = 0;
            for (int j=1; j<=maxcul; j++){
                sol = max (sol, d[j][dr] - d[j][st]);
            }
            fout << sol << "\n";
        }
    }
    return 0;
}