Cod sursa(job #2517533)

Utilizator mirceaisherebina mircea mirceaishere Data 3 ianuarie 2020 18:11:32
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <algorithm>
using namespace std;

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

int n, m, i, j, t, k, culoaremaxima, s[80][100010], st, dr, mij, start, sfarsit, maxim, aux;

struct bila{
    int pozitie;
    int culoare;
}v[100010];

bool cmp(bila a, bila b){
    return a.pozitie<b.pozitie;
}

int main(){
    fin>>n>>m;
    for(i=1; i<=n; i++){
        fin>>v[i].pozitie>>v[i].culoare;
        if(v[i].culoare>culoaremaxima){
            culoaremaxima=v[i].culoare;
        }
    }
    sort(v+1, v+n+1, cmp);
    for(i=1; i<=n; i++){
        for(k=1; k<=culoaremaxima; k++){
            /// s[k][i] = cate bile de culoarea k se afla pana la pozitia i
            if(k==v[i].culoare){
                s[k][i]=1+s[k][i-1];
            }else{
                s[k][i]=s[k][i-1];
            }
        }
    }
    for(aux=1; aux<=m; aux++){
        fin>>t>>i>>j;
        if(t==0){
            /// operatie de mutare a bilei aflata la coordonata i la coordonata i+j
            /// caut binar indicele bilei cu pozitia i
            st=1;
            dr=n;
            while(st<=dr){
                mij=(st+dr)/2;
                if(v[mij].pozitie<i){
                    st=mij+1;
                }else{
                    dr=mij-1;
                }
            }
            v[st].pozitie+=j;
        }else{
            /// care este numarul maxim de bile de aceeasi culoare care se afla intre coordonatele i si j inclusiv
            maxim=0;
            st=1;
            dr=n;
            while(st<=dr){
                mij=(st+dr)/2;
                if(v[mij].pozitie<i){
                    st=mij+1;
                }else{
                    dr=mij-1;
                }
            }
            start=st;
            st=1;
            dr=n;
            while(st<=dr){
                mij=(st+dr)/2;
                if(v[mij].pozitie<=j){
                    st=mij+1;
                }else{
                    dr=mij-1;
                }
            }
            sfarsit=dr;
            for(k=1; k<=culoaremaxima; k++){
                maxim=max(maxim, s[k][sfarsit]-s[k][start-1]);
            }
            fout<<maxim<<"\n";
        }
    }
}