Cod sursa(job #2522182)

Utilizator mihnea03Ciocioiu Mihnea mihnea03 Data 12 ianuarie 2020 01:43:45
Problema Marbles Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <algorithm>
using namespace std;
pair <int,int> a[100010];
int b[64][100010];
int i,j,n,m,p,c,cMax,q,p1,p2,poz,val,x,st,dr,mid;

int cautBin (int x) {
    int st=1,dr=n;
    while (st<=dr) {
        int mid=(st+dr)/2;
        if (a[mid].first==x) return mid;
        if (a[mid].first>=x) dr=mid-1;
        else st=mid+1;
    }
}

void creareMatrice () {
    for (i=1;i<=cMax;i++) {
        for (j=1;j<=n;j++) {
            if (a[j].second==i) {
                b[i][j]=b[i][j-1]+1;
            }
            else b[i][j]=b[i][j-1];
        }
    }
}

int main() {
    ifstream fin("marbles.in");
    ofstream fout("marbles.out");
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        fin>>p>>c;
        a[i]=make_pair(p,c);   ///a[i].first=pozitie
        cMax=max(cMax,c);      ///a[i].second=culoare
    }
    sort(a+1,a+n+1);
    creareMatrice();
    for (x=1;x<=m;x++) {
        fin>>q>>p1>>p2;
        if (q==0) {
            poz=cautBin(p1);
            a[poz].first+=p2;
        }
        else {
            st=1;
            dr=n;
            while (st<=dr) {  ///caut cea mai mica pozitie cu valoare mai mare sau egala decat p1
                mid=(st+dr)/2;
                if (a[mid].first>=p1) dr=mid-1;
                else st=mid+1;
            }
            p1=st;
            st=1;
            dr=n;
            while (st<=dr) {  ///caut cea mai mare pozitie cu valoare mai mica sau egala decat p2
                mid=(st+dr)/2;
                if (a[mid].first<=p2) st=mid+1;
                else dr=mid-1;
            }
            p2=dr;
            val=0;
            for (i=1;i<=cMax;i++) {
                val=max(val,b[i][p2]-b[i][p1-1]);
            }
            fout<<val<<"\n";
        }
    }
    return 0;
}