Cod sursa(job #1412979)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 1 aprilie 2015 17:58:57
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
#define f first
#define s second
#define N 100005
#include <algorithm>

using namespace std;

int i,j,b[N][65],m,n,typ,x,xx,y,Max;
pair<int,int> a[N];

int DetPoz(int x)
{
   int p=1,u=n,mj;

   while(p<=u)
   {
       mj=(int)(1LL*(1LL*p+1LL*u)/2);
       if(a[mj].f==x) return mj;
       if(a[mj].f<x) p=mj+1;
       else u=mj-1;
   }
   return p;
}
int DetPoz2(int x)
{
    int k=DetPoz(x);
    if(a[k].f==x) return k;
    return k-1;
}
int main()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);

    scanf("%d%d",&n,&m);

    for(i=1;i<=n;++i)
    scanf("%d%d",&a[i].f,&a[i].s);

    sort(a+1,a+n+1);

    for(i=1;i<=n;++i)
    for(j=0;j<64;++j)
    {
        b[i][j]=b[i-1][j];
        if(a[i].s==j+1) ++b[i][j];
    }
    for(;m;--m)
    {
         scanf("%d%d%d",&typ,&x,&y);

         if(typ==1 && x>y)
         {
             printf("0\n");
             continue;
         }
         x=DetPoz(x);
         if(typ==1)
         {
             Max=0;y=DetPoz2(y);
             if(x>y)
             {
                 printf("0\n");
                 continue;
             }
             for(i=0;i<64;++i)
             {
                 xx=b[y][i]-b[x-1][i];
                 if(Max<xx) Max=xx;
             }
             printf("%d\n",Max);
         }
         else a[x].f+=y;
    }
    return 0;
}