Cod sursa(job #1412974)

Utilizator danstefanDamian Dan Stefan danstefan Data 1 aprilie 2015 17:58:12
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
//deci daca iau peste 50 pe asta dau de baut
#include <algorithm>
#include <fstream>
#include <cstdio>
using namespace std;
int a[100010][70], ics[100010],n,m,pp,ma=0,i,j,x,y,z,sol,in,preotu,jakub,reus,ginter;
struct borcanu{int x, y;}v[100010];
bool parfumat_si_par_fumat(borcanu x, borcanu y){
    return x.x<y.x;}
int main() {
    freopen("marbles.in","r",stdin);
    ofstream g("marbles.out");
   scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
        scanf("%d%d",&v[i].x,&v[i].y);
    sort(v+1,v+n+1,parfumat_si_par_fumat);
    for(i=1;i<=n;++i){
        ics[i]=v[i].x;
        for(j=1;j<=64;++j)a[i][j]=a[i-1][j];
        a[i][v[i].y]++;}
    for(pp=1;pp<=n/2;pp*=2);
    for(in=1;in<=m;++in){
        scanf("%d%d%d",&x,&y,&z);
        if(x==0){
            sol=0;
            preotu=pp;
            while(preotu){
                if(sol+preotu<=n&&ics[sol+preotu]<=y)sol+=preotu;
                preotu/=2;}
            ics[sol]+=z;}
            else{
            reus=n,ginter=0;
            jakub=pp;
            while(jakub){
                if(reus-jakub>=1&&ics[reus-jakub]>=y)reus-=jakub;
                if(ginter+jakub<=n&&ics[ginter+jakub]<=z)ginter+=jakub;
            jakub/=2;}
            ma=0;
            for(i=1;i<=64;++i)ma=max(ma,a[ginter][i]-a[reus-1][i]);
            if (ics[reus]<y||ics[ginter]>z)ma=0;
            g<<ma<<'\n';}}
    return 0;}