Cod sursa(job #2521852)

Utilizator maria15Maria Dinca maria15 Data 11 ianuarie 2020 16:55:10
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <algorithm>
#define poz first
#define cul second

using namespace std;

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

int n, m, i, j, op, nr[100001][65], culoare, st, dr, mid, maxim, stanga, dreapta;
pair<int, int> v[100001];

int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++){
        fin>>v[i].poz>>v[i].cul;
    }
    sort(v+1, v+n+1);
    for(i=1;i<=n;i++){
        culoare = v[i].cul;
        for(j=1;j<=64;j++)
            if(j == culoare)
                nr[i][j] = nr[i-1][j] + 1;
            else
                nr[i][j] = nr[i-1][j];
    }

    while(m--){
        fin>>op>>i>>j;
        if(op == 0){
            st = 1;
            dr = n;
            while(st<=dr){
                mid = (st+dr)/2;
                if(v[mid].poz < i)
                    st = mid+1;
                else
                    dr = mid-1;
            }
            v[st].poz = i+j;
        }
        else{
            st = 1;
            dr = n;
            while(st<=dr){
                mid = (st+dr)/2;
                if(v[mid].poz < i)
                    st = mid+1;
                else
                    dr = mid-1;
            }
            stanga = st-1;
            st = 1;
            dr = n;
            while(st <= dr){
                mid = (st+dr)/2;
                if(v[mid].poz > j)
                    dr = mid-1;
                else
                    st = mid+1;
            }
            dreapta = dr;
            maxim = 0;
            for(i=1;i<=64;i++)
                if(nr[dreapta][i] - nr[stanga][i] > maxim)
                    maxim = nr[dreapta][i] - nr[stanga][i];
            fout<<maxim<<"\n";
        }
    }
    return 0;
}