Cod sursa(job #2549521)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 17 februarie 2020 19:17:36
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
using namespace std;
ifstream  fin("marbles.in");
ofstream  fout("marbles.out");
 
const int DIM = 1e5 + 5;
 
int N, M, st, dr, mid, f[66][DIM];
pair<int,int> arr[DIM];
 
int main(){
    fin >> N >> M;
    for( int i = 1; i <= N; i++ )
        fin >> arr[i].first >> arr[i].second;
 
    sort( arr + 1, arr + N + 1 );
    for( int i = 1; i <= N; i++ )
        f[ arr[i].second ][i] = 1;
 
    for( int c = 1; c <= 65; c++ )
        for( int i = 1; i <= N; i++ )
            f[c][i] += f[c][i - 1];
 
    for( int i = 1; i <= M; i++ ){
        int op, x, y; fin >> op >> x >> y;
        if( op == 0 ) {
            for (st = 1, dr = N; st <= dr;) {
                mid = (st + dr) >> 1;
                if (arr[mid].first == x) {
                    arr[mid].first = x + y;
                    break;
                }
                if (arr[mid].first < x)
                    st = mid + 1;
                else
                    dr = mid - 1;
            }
        }else{
            int p1, p2;
            for (st = 1, dr = N; st <= dr;) {
                mid = (st + dr) >> 1;
                if (arr[mid].first <= y)
                    st = mid + 1;
                else
                    dr = mid - 1;
            }
            p2 = dr;
            for (st = 1, dr = N; st <= dr;) {
                mid = (st + dr) >> 1;
                if (arr[mid].first < x)
                    st = mid + 1;
                else
                    dr = mid - 1;
            }
            p1 = st;
            int ans = 0;
            for( int c = 1; c <= 65; c++ )
                ans = max( ans,  f[c][p2] - f[c][p1 - 1] );
            fout << ans << "\n";
        }
    }
 
 
    return 0;
}