Cod sursa(job #2517501)

Utilizator MihneaGhiraMihnea MihneaGhira Data 3 ianuarie 2020 17:39:39
Problema Marbles Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include<fstream>
#include<algorithm>
#define x first
#define y second
using namespace std;
ifstream fin("marbles.in");
ofstream fout("marbles.out");
int n,m,mid,k,op,maxim,maxim2,st2,dr2,st1,dr1;
int D[70][100010];
pair<int,int> p[100010];
int main(){
    fin>>n>>m;
    for(int i=1;i<=n;i++){
        fin>>p[i].x>>p[i].y;
        if (p[i].y>maxim)
            maxim=p[i].y;
    }
    sort(p+1,p+n+1);

    for(int i=1;i<=n;i++){
        for(int j=1;j<=maxim;j++)
            if(j==p[i].y)
                D[j][i]=D[j][i-1]+1;
            else
                D[j][i]=D[j][i-1];
    }

    for(int T=1;T<=m;T++){
        int X,Y;
        fin>>op>>X>>Y;
        if(op==0){
            st1=1;
            dr1=n;
            while(st1<=dr1){
                mid=st1+(dr1-st1)/2;

                if(p[mid].x==X){
                    break;
                }
                if(p[mid].x<X){
                    st1=mid+1;
                }
                else{
                    dr1=mid-1;
                }
            }

            if(st1<=dr1){
                p[mid].x+=Y;
            }
        }
        else{
            st1=1;
            dr1=n;
            while(st1<=dr1){
                mid=st1+(dr1-st1)/2;
                if(p[mid].x<X){
                    st1=mid+1;
                }
                else{
                    dr1=mid-1;
                }
            }
            st2=st1;
            st1=1;
            dr1=n;
            while(st1<=dr1){
                mid=st1+(dr1-st1)/2;

                if(p[mid].x>Y){
                    dr1=mid-1;
                }
                else{
                    st1=mid+1;
                }
            }
            dr2=dr1;
            maxim2=0;
            for(int i=1;i<=maxim;i++){
                if(D[i][dr2]-D[i][st2-1]>maxim2){
                    maxim2=D[i][dr2]-D[i][st2-1];
                }
            }

            fout<<maxim2<<"\n";
        }
    }
    return 0;
}