Cod sursa(job #2126797)

Utilizator sichetpaulSichet Paul sichetpaul Data 9 februarie 2018 23:08:29
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <algorithm>
#define x first
#define c second
using namespace std;
int s[100003][65];
pair <int,int> x[100003];
int main()
{ int st,dr,mij,m,n,poz,l,r,i,j,p,tip;
    ifstream f("marbles.in");
    ofstream g("marbles.out");
    f>>n>>m;
    for (i=1;i<=n;++i)
        f>>x[i].x>>x[i].c;
    sort(x+1,x+n+1);
    for (i=1;i<=n;++i) {
        for (j=1;j<=64;++j)
            s[i][j]=s[i-1][j];
        ++s[i][x[i].c];
    }
    for (p=1;p<=m;++p) {
        f>>tip>>i>>j;
        if (tip==0) {
            st=1,dr=n;
            while (st<=dr) {
                mij=(st+dr)/2;
                if (x[mij].x<i) st=mij+1;
                if (x[mij].x==i) {
                    poz=mij;
                    break;
                }
                if (x[mij].x>i) dr=mij-1;
            }
            x[poz].x+=j;
        }
        else {
          l=n;
          st=1,dr=n;
          while (st<=dr) {
            mij=(st+dr)/2;
            if (x[mij].x<i) st=mij+1;
            else l=min(l,mij),dr=mij-1;
          }
          r=n;
          st=1,dr=n;
          while (st<=dr) {
                mij=(st+dr)/2;
                if (x[mij].x<j) st=mij+1;
                else r=min(r,mij),dr=mij-1;
        }

        int Max=0;
        if (i<=x[n].x) {
        for (i=1;i<65;++i)
            Max=max(Max,s[r][i]-s[l-1][i]);
         g<<Max<<'\n';
        }
        else g<<"0"<<'\n';
    }
    }
        return 0;
}