Cod sursa(job #2522574)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 12 ianuarie 2020 18:06:40
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <bits/stdc++.h>
#define poz first
#define cul second
#define DIM 100010
using namespace std;
ifstream fin("marbles.in");
ofstream fout("marbles.out");
int n,m,i,j,s[70][DIM],cod,culmax,sol,st,dr,mid,p,u;
pair<int,int> v[DIM];
int main() {
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        fin>>v[i].poz>>v[i].cul;
        culmax=max(v[i].cul,culmax);
    }
    sort(v+1,v+n+1);
    for (i=1;i<=n;i++)
        for (j=1;j<=culmax;j++) {
            if (v[i].cul==j)
                s[j][i]=1+s[j][i-1];
            else
                s[j][i]=s[j][i-1];
        }
    while (m--) {
        fin>>cod>>i>>j;
        if (cod==0) {
            st=1, dr=n;
            while (st<=dr) {
                mid=(st+dr)/2;
                if (v[mid].poz==i)
                    break;
                if (v[mid].poz<i)
                    st=mid+1;
                else
                    dr=mid-1;
            }
            if (st<=dr) //am gasit bila de la coordonata i
                v[mid].poz+=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;
            }
            p=st;
            st=1, dr=n;
            while (st<=dr) {
                mid=(st+dr)/2;
                if (v[mid].poz>j)
                    dr=mid-1;
                else
                    st=mid+1;
            }
            u=dr;
            sol=0;
            for (i=1;i<=culmax;i++)
                sol=max(sol,s[i][u]-s[i][p-1]);
            fout<<sol<<"\n";
        }
    }
    return 0;
}