Cod sursa(job #1510549)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 25 octombrie 2015 12:06:37
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#define nmax 100005
#define cmax 65
using namespace std;
struct nod{
    int l,c[cmax];
} v[nmax];
int n,m;
struct nod2{
    int x;int y;
} a[nmax];



int binarylow(int k)
{
    int sol=0;
    for (int bit=1<<16;bit;bit>>=1)
        if (sol+bit<=n&&v[sol+bit].l<k)
            sol+=bit;
    return sol+1;
}
int binaryhigh(int k)
{
    int sol=0;
    for (int bit=1<<16;bit;bit>>=1)
        if (sol+bit<=n&&v[sol+bit].l<=k)
            sol+=bit;
    return sol;
}
bool cmp(const nod2 &a,const nod2 &b)
{
    return a.x<b.x;
}
int main()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);
    scanf("%d %d",&n,&m);
    int i,j,k,t,sol,op;

    for (i=1;i<=n;i++)
        scanf("%d %d",&a[i].x,&a[i].y);
    sort(a+1,a+n+1,cmp);


    for (i=1;i<=n;i++) {
        v[i].l=a[i].x;
        for (j=1;j<cmax;j++)
            v[i].c[j]=v[i-1].c[j];
        v[i].c[a[i].y]++;
    }
    for (i=1;i<=m;i++) {
        scanf("%d %d %d",&op,&j,&k);
        if (op==0) {
            j=binaryhigh(j);
            v[j].l+=k;
        }
        else {
            sol=0;
            if (j>k) {
                printf("0\n");
                continue;
            }
            j=binarylow(j);
            k=binaryhigh(k);
            if (j>k) {
                printf("0\n");
                continue;
            }
            for (t=1;t<cmax;t++)
                sol=max(sol,v[k].c[t]-v[j-1].c[t]);
            printf("%d\n",sol);
        }
    }
    return 0;
}