Pagini recente » Cod sursa (job #2472820) | Cod sursa (job #1709882) | Cod sursa (job #146669) | Cod sursa (job #1709559) | Cod sursa (job #2527863)
#include <fstream>
#include <algorithm>
#define poz first
#define cul second
using namespace std;
ifstream fin("marbles.in");
ofstream fout("marbles.out");
int n,m,i,j,x,y,op,st,dr,mid,poz1,poz2,mx,s[70][100005];
pair<int,int> v[100005];
int main(){
fin>>n>>m;
for(i=1;i<=n;i++)
fin>>v[i].poz>>v[i].cul;
sort(v+1,v+n+1);
//s[j][i]=? bile de culoarea j pana la pozitia bilei cu indicele i
for(i=1;i<=n;i++)
for(j=1;j<=64;j++)
if(v[i].cul==j)
s[i][j]=s[i-1][j]+1;
else s[i][j]=s[i-1][j];
for(i=1;i<=m;i++){
fin>>op>>x>>y;
if(op==0){
//caut binar ce indice are bila de pe poz x si ii actualizez pozitia cu +y, se garanteaza ca nu sare peset alta bila
st=1; dr=n;
while(st<=dr){
mid=(st+dr)/2;
if(v[mid].poz==x)break;
if(v[mid].poz<x)
st=mid+1;
else dr=mid-1;
}
v[mid].poz+=y;
continue;
}
//ma intereseaza nr max de bile de aceeasi cul dintre pozitiile x,y
//caut binar prima pozitie >= x ocupata de bila si ultima <= y si apoi pt cele 64 culori determin maximul din s partiale
st=1; dr=n;
while(st<=dr){
mid=(st+dr)/2;
if(v[mid].poz<x)
st=mid+1;
else dr=mid-1;
}
poz1=st;
st=1; dr=n;
while(st<=dr){
mid=(st+dr)/2;
if(v[mid].poz<=y)
st=mid+1;
else dr=mid-1;
}
poz2=dr;
mx=-1;
for(j=1;j<=64;j++)
mx=max(mx,s[poz2][j]-s[poz1-1][j]);
fout<<mx<<"\n";
}
return 0;
}