Pagini recente » Cod sursa (job #2623144) | Cod sursa (job #152210) | Cod sursa (job #2802361) | Cod sursa (job #236615) | Cod sursa (job #982409)
Cod sursa(job #982409)
#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;
}