Cod sursa(job #485641)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 18 septembrie 2010 23:24:03
Problema Marbles Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>
#include<algorithm>
#define N 1<<17
#define NRC 65
using namespace std;
struct bila
{
    int x,c;
};
bila a[N];
int n,m,d[NRC][N];
bool comp(const bila &A,const bila &B)
{
    return (A.x<B.x);
}
void read()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].c);
}
void init()
{
    sort(a+1,a+n+1,comp);
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            d[a[i].c][j]++;
}
int cautb(int nb,int type)//type 1=greater or equal; type 2=lesser; type 3=lesser or equal
{
    int pas=N,i=0;
    for(i=0;pas;pas>>=1)
        if(i+pas<=n && a[i+pas].x<=nb)
                i+=pas;
    if(type==1) return i;
    else if (type==2)
    {
        if(a[i].x==nb)
            return i-1;
        else return i;
    }
    else
        return i;
}
void move(int x,int y)
{
    int poz=cautb(x,1);
    a[poz].x=x+y;
}
void interogare(int x,int y)
{
    int poz1=cautb(x,2);
    int poz2=cautb(y,3);
    int maxim=-1;
    for(int i=1;i<65;i++)
        if(d[i][poz2]-d[i][poz1]>maxim)
            maxim=d[i][poz2]-d[i][poz1];
    printf("%d\n",maxim);
}
void solve()
{
    int tip,x,y;
    for(;m>=1;m--)
    {
        scanf("%d%d%d",&tip,&x,&y);
        if(tip==1)
            interogare(x,y);
        else
            move(x,y);
    }
}
int main()
{
    read();
    init();
    solve();
    return 0;
}