Cod sursa(job #166326)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 27 martie 2008 20:41:27
Problema Marbles Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <stdlib.h>
#define nMax 100005
#define tMax 65

long n,m,i,j,p[nMax],tip[nMax],ind[nMax];
long p1,p2,t,a,b,s[nMax][tMax],max;

int comp(const void * n1, const void * n2){
    return p[*((long*)n1)]-p[*((long*)n2)];
}

long bsearch(long v){
    long low=1,high=n,mid;
    while(low<=mid){
        mid=(low+high)/2;
        if (p[ind[mid]]>v)
            high=mid-1;
        else if (p[ind[mid]]<v)
                low=mid+1;
            else return mid;
    }
return low;
}

long endsearch(long v){
    long low=1,mid,high=n+1;
    while (low<high){
        mid=(low+high)/2;
        if (p[ind[mid]]<v)
           low=mid+1;
        else
            high=mid;
    }
return low;
}

int main(){
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);

    scanf("%ld %ld",&n,&m);
    for (i=1;i<=n;i++){
        scanf("%ld %ld",&p[i],&tip[i]);
        ind[i]=i;
    }
    qsort(ind+1,n,sizeof(long),comp);
    for (i=1;i<=n;i++){
        for (j=1;j<=64;j++)
            s[i][j]=s[i-1][j];
        s[i][tip[ind[i]]]++;
    }
    for (j=1;j<=64;j++)
        s[n+1][j]=s[n][j];

    for (i=1;i<=m;i++){
        scanf("%ld %ld %ld",&t,&a,&b);
        if (t==0)
           p[ind[bsearch(a)]]+=b;
        else{
            p1=endsearch(a);
            p2=endsearch(b);
            if (p[ind[p2]]!=b)p2--;
            max=0;
            for (j=1;j<=64;j++)
                if (s[p2][j]-s[p1-1][j]>max)max=s[p2][j]-s[p1-1][j];
            if (p1>p2)max=0;
            printf("%ld\n",max);
        }
    }

return 0;
}