Cod sursa(job #2521846)

Utilizator maria15Maria Dinca maria15 Data 11 ianuarie 2020 16:51:36
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.88 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);
    /// vreau sa aflu cate bile din fiecare culoare se afla printre primele i bile inclusiv
    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;  /// cate erau si inainte, plus bila curenta
            else
                nr[i][j] = nr[i-1][j];
    }
    /// FOARTE FOARTE IMPORTANT!!!
    /// PRIN MUTAREA BILELOR DE COLO-COLO, NU INTERSCHIMBAM NICIODATA DOUA BILE, DEOARECE FIECARE BILA SE PLIMBA INTR-UN SPATIU GOL
    /// (STIM CA INTRE I SI I+J NU SE AFLA NICIO ALTA BILA)
    /// DE ACEEA, E FOARTE BINE CA STIM DE CATE ORI APARE FIECARE CULOARE PRINTRE PRIMELE I BILE
    /// CACI ACEST NUMAR NU SE SCHIMBA NICIODATA

    while(m--){
        fin>>op>>i>>j;
        if(op == 0){    /// mut bila de pe pozitia i pe pozitia i+j
            /// caut binar pozitia i in vectorul v (care este sortat crescator dupa poz)
            /// si schimb in zero culoarea aferenta acestei pozitii
            /// 1...n bilele si eu vreau bila care are pozitia i
            st = 1;
            dr = n;
            while(st<=dr){
                mid = (st+dr)/2;
                if(v[mid].poz < i)
                    st = mid+1;
                else
                    dr = mid-1;
            }
            /// acum stiu ca v[st].poz este i. trebuie sa devina i+j; e ok in ceea ce priveste cautarea binara, pentru ca, again, nu se schimba ordinea bilelor
            v[st].poz = i+j;
        }
        else{   /// vreau sa stiu care e nr maxim de bile de aceeasi culoare intre coordonatele i si j
            /// caut binar bila cu cea mai mica coordonata cel putin egala cu i si bila cu cea mai mare coordonata cel mult egala cu j
            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;
}