Pagini recente » Cod sursa (job #2449574) | Cod sursa (job #356611) | Cod sursa (job #1872234) | Cod sursa (job #1711722) | Cod sursa (job #2517533)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("marbles.in");
ofstream fout("marbles.out");
int n, m, i, j, t, k, culoaremaxima, s[80][100010], st, dr, mij, start, sfarsit, maxim, aux;
struct bila{
int pozitie;
int culoare;
}v[100010];
bool cmp(bila a, bila b){
return a.pozitie<b.pozitie;
}
int main(){
fin>>n>>m;
for(i=1; i<=n; i++){
fin>>v[i].pozitie>>v[i].culoare;
if(v[i].culoare>culoaremaxima){
culoaremaxima=v[i].culoare;
}
}
sort(v+1, v+n+1, cmp);
for(i=1; i<=n; i++){
for(k=1; k<=culoaremaxima; k++){
/// s[k][i] = cate bile de culoarea k se afla pana la pozitia i
if(k==v[i].culoare){
s[k][i]=1+s[k][i-1];
}else{
s[k][i]=s[k][i-1];
}
}
}
for(aux=1; aux<=m; aux++){
fin>>t>>i>>j;
if(t==0){
/// operatie de mutare a bilei aflata la coordonata i la coordonata i+j
/// caut binar indicele bilei cu pozitia i
st=1;
dr=n;
while(st<=dr){
mij=(st+dr)/2;
if(v[mij].pozitie<i){
st=mij+1;
}else{
dr=mij-1;
}
}
v[st].pozitie+=j;
}else{
/// care este numarul maxim de bile de aceeasi culoare care se afla intre coordonatele i si j inclusiv
maxim=0;
st=1;
dr=n;
while(st<=dr){
mij=(st+dr)/2;
if(v[mij].pozitie<i){
st=mij+1;
}else{
dr=mij-1;
}
}
start=st;
st=1;
dr=n;
while(st<=dr){
mij=(st+dr)/2;
if(v[mij].pozitie<=j){
st=mij+1;
}else{
dr=mij-1;
}
}
sfarsit=dr;
for(k=1; k<=culoaremaxima; k++){
maxim=max(maxim, s[k][sfarsit]-s[k][start-1]);
}
fout<<maxim<<"\n";
}
}
}