Cod sursa(job #317329)

Utilizator taloibogdanTaloi Bogdan Cristian taloibogdan Data 23 mai 2009 10:17:51
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
struct bila{long x,c;}a[100005];
long n,m,i,mac,ma,j,nr[70][100005],x[100005],op,st,dr,poz,poz1;
int cmp(bila A,bila B)
{if(A.x<B.x)return 1;
return 0;}
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",&a[i].x,&a[i].c);
     if(a[i].c>mac)mac=a[i].c;}
 sort(a,a+n,cmp);
 for(i=1;i<=mac;++i)
    for(j=1;j<=n;++j)
       nr[i][j]=nr[i][j-1]+(a[j].c==i);
 for(i=1;i<=n;++i)
    x[i]=a[i].x;
 for(i=1;i<=m;++i)
    {scanf("%ld%ld%ld",&op,&st,&dr);
     if(st>dr&&op==1){printf("0");continue;}
     long* p=lower_bound(x,x+n,st);
     poz=p-x;
     if(x[poz+1]==st)poz++;
     if(poz)if(x[poz-1]==st)poz--;
     if(op==0)a[poz].x+=dr,x[poz]+=dr;
      else
       {p=lower_bound(x,x+n,dr);
        poz1=p-x;
        ma=0;
        if(x[poz]<st)++poz;
        if(x[poz1]<dr)++poz1;
        for(j=1;j<=mac;++j)
           if(nr[j][poz1]-nr[j][poz-1]>ma)ma=nr[j][poz1]-nr[j][poz-1];
        printf("%ld\n",ma);}}
 return 0;
}