Cod sursa(job #982409)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 9 august 2013 11:04:37
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include<cstdio>
#include<algorithm>
#define DIM 100010
using namespace std;
struct bila {
    int x;
    int c;
};

int n,m,i,j,c,o,in,fin,V[65][DIM],a,maxim,b,p,u,mid;
FILE *f,*g;

bila v[DIM];

int cmp(bila a, bila b) {
    return a.x < b.x;
}
int cauta(int x){
    //cauta prima bila cu o coordonata aflata in st sau egala cu x
    int u=n,p=1,mid;
    while(p<=u){
        mid=(p+u)/2;
        if(v[mid].x<=x)
            p=mid+1;
        else
            u=mid-1;
    }
    return u;
}
int main(){
    f=fopen("marbles.in","r");
    g=fopen("marbles.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        fscanf(f,"%d%d",&v[i].x,&v[i].c);
    }

    sort(v+1, v+n+1, cmp);
    for(j=1;j<=64;j++){
        for(i=1;i<=n;i++){
            if(v[i].c==j)
                V[j][i]=V[j][i-1]+1;
            else
                V[j][i]=V[j][i-1];
        }
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&o,&in,&fin);
        if(o==0){
            //cautam pozitia din sirul de bile a
            //bilei aflate la pozitia aflate pe pozitia in
            // pe axa reala
            p=1;
            u=n;
            while(p<=u){
                mid=(p+u)/2;
                if(v[mid].x==in)
                    break;
                else if(v[mid].x>in)
                    u=mid-1;
                else
                    p=mid+1;
            }
            if(p<=u)
                v[mid].x+=fin;
        }
        else{
            a=cauta(in-1);
            b=cauta(fin);
            maxim=0;
            for(j=1;j<=64;j++){
                if(V[j][b]-V[j][a]>maxim)
                    maxim=V[j][b]-V[j][a];
            }
            fprintf(g,"%d\n",maxim);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}