Pagini recente » Cod sursa (job #1574476) | Cod sursa (job #2023044) | Cod sursa (job #3223606) | Monitorul de evaluare | Cod sursa (job #2521846)
#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, op, nr[100001][65], culoare, st, dr, mid, maxim, stanga, dreapta;
pair<int, int> v[100001];
int main(){
fin>>n>>m;
for(i=1;i<=n;i++){
fin>>v[i].poz>>v[i].cul;
}
sort(v+1, v+n+1);
/// vreau sa aflu cate bile din fiecare culoare se afla printre primele i bile inclusiv
for(i=1;i<=n;i++){
culoare = v[i].cul;
for(j=1;j<=64;j++)
if(j == culoare)
nr[i][j] = nr[i-1][j] + 1; /// cate erau si inainte, plus bila curenta
else
nr[i][j] = nr[i-1][j];
}
/// FOARTE FOARTE IMPORTANT!!!
/// PRIN MUTAREA BILELOR DE COLO-COLO, NU INTERSCHIMBAM NICIODATA DOUA BILE, DEOARECE FIECARE BILA SE PLIMBA INTR-UN SPATIU GOL
/// (STIM CA INTRE I SI I+J NU SE AFLA NICIO ALTA BILA)
/// DE ACEEA, E FOARTE BINE CA STIM DE CATE ORI APARE FIECARE CULOARE PRINTRE PRIMELE I BILE
/// CACI ACEST NUMAR NU SE SCHIMBA NICIODATA
while(m--){
fin>>op>>i>>j;
if(op == 0){ /// mut bila de pe pozitia i pe pozitia i+j
/// caut binar pozitia i in vectorul v (care este sortat crescator dupa poz)
/// si schimb in zero culoarea aferenta acestei pozitii
/// 1...n bilele si eu vreau bila care are pozitia i
st = 1;
dr = n;
while(st<=dr){
mid = (st+dr)/2;
if(v[mid].poz < i)
st = mid+1;
else
dr = mid-1;
}
/// acum stiu ca v[st].poz este i. trebuie sa devina i+j; e ok in ceea ce priveste cautarea binara, pentru ca, again, nu se schimba ordinea bilelor
v[st].poz = i+j;
}
else{ /// vreau sa stiu care e nr maxim de bile de aceeasi culoare intre coordonatele i si j
/// caut binar bila cu cea mai mica coordonata cel putin egala cu i si bila cu cea mai mare coordonata cel mult egala cu j
st = 1;
dr = n;
while(st<=dr){
mid = (st+dr)/2;
if(v[mid].poz < i)
st = mid+1;
else
dr = mid-1;
}
stanga = st-1;
st = 1;
dr = n;
while(st <= dr){
mid = (st+dr)/2;
if(v[mid].poz > j)
dr = mid-1;
else
st = mid+1;
}
dreapta = dr;
maxim = 0;
for(i=1;i<=64;i++)
if(nr[dreapta][i] - nr[stanga][i] > maxim)
maxim = nr[dreapta][i] - nr[stanga][i];
fout<<maxim<<"\n";
}
}
return 0;
}