Cod sursa(job #2527867)

Utilizator divianegoescuDivia Negoescu divianegoescu Data 20 ianuarie 2020 22:21:13
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.7 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,x,y,op,st,dr,mid,poz1,poz2,mx,s[100005][70];
pair<int,int> v[100005];
int main(){
    fin>>n>>m;
    for(i=1;i<=n;i++)
        fin>>v[i].poz>>v[i].cul;
    sort(v+1,v+n+1);
    //s[j][i]=? bile de culoarea j pana la pozitia bilei cu indicele i
    for(i=1;i<=n;i++)
        for(j=1;j<=64;j++)
            if(v[i].cul==j)
                s[i][j]=s[i-1][j]+1;
            else s[i][j]=s[i-1][j];
    for(i=1;i<=m;i++){
        fin>>op>>x>>y;
        if(op==0){
//caut binar ce indice are bila de pe poz x si ii actualizez pozitia cu +y, se garanteaza ca nu sare peset alta bila
        st=1; dr=n;
        while(st<=dr){
            mid=(st+dr)/2;
            if(v[mid].poz==x)break;
            if(v[mid].poz<x)
                st=mid+1;
            else dr=mid-1;
        }
        v[mid].poz+=y;
        continue;
        }
//ma intereseaza nr max de bile de aceeasi cul dintre pozitiile x,y
//caut binar prima pozitie >= x ocupata de bila si ultima <= y si apoi pt cele 64 culori determin maximul din s partiale
        st=1; dr=n;
        while(st<=dr){
            mid=(st+dr)/2;
            if(v[mid].poz<x)
                st=mid+1;
            else dr=mid-1;
        }
        poz1=st;
        st=1; dr=n;
        while(st<=dr){
            mid=(st+dr)/2;
            if(v[mid].poz<=y)
                st=mid+1;
            else dr=mid-1;
        }
        poz2=dr;
        mx=-1;
        for(j=1;j<=64;j++)
            mx=max(mx,s[poz2][j]-s[poz1-1][j]);
        fout<<mx<<"\n";
    }
    return 0;
}