Cod sursa(job #982414)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 9 august 2013 11:14:07
Problema Marbles Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<cstdio>
#include<fstream>
#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;
ifstream f("marbles.in");
ofstream g("marbles.out");
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)>>1;
        if(v[mid].x<=x)
            p=mid+1;
        else
            u=mid-1;
    }
    return u;
}
int main(){
    f>>n>>m;
    for(i=1;i<=n;i++){
        f>>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++){
        f>>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)>>1;
                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];
            }
            g<<maxim<<"\n";
        }
    }
    f.close();
    g.close();
    return 0;
}