lumini

Privită din spațiu, harta insulei din povestea noastră are forma unui caroiaj pătratic cu L linii și L coloane. Liniile și coloanele sunt numerotate de la 1 la L. În fiecare dintre cele L*L celule se află câte un far. Inițial cel de la poziția 1,1 este aprins și toate respectă regula: orice far are farurile vecine (pe linie și coloană, deci maximum 4) în starea opusă față de starea sa. În urma unei furtuni, s-au întâmplat lucruri ciudate: fulgerele au lovit unul după altul și au afectat starea unor faruri. Sunt trei tipuri de fulgere:

  • Fulger de tip 1. Pentru acesta se indică linia pe care lovește și el afectează starea farurilor de pe linia respectivă și de pe liniile cu număr de ordine mai mare. Mai exact, toate farurile de pe aceste linii își schimbă instantaneu starea.
  • Fulger de tip 2. Pentru acesta se indică un număr ce reprezintă coloana pe care lovește și el afectează starea farurilor de pe coloana respectivă și de pe coloanele cu număr de ordine mai mare. Mai exact, toate farurile de pe aceste coloane își schimbă instantaneu starea.
  • Fulger de tip 3. Pentru acesta se indică linia apoi coloana unui element din caroiaj. Toate farurile aflate pe aceeași paralelă cu diagonala secundară cu elementul specificat și pe paralelele cu diagonala secundară aflate sub aceasta, își schimbă starea.
    Prin schimbarea stării unui far înțelegem că acesta se aprinde dacă este stins și se stinge dacă este aprins.

Cerința

Se dau date despre fulgere, în ordinea în care acestea acționează. Se cere ca la finalul furtunii să se indice care este starea anumitor faruri, aflate la coordonate precizate de pe insulă.

Date de intrare

Prima linie a fișierului lumini.in conține un numărul natural L, cu semnificația de mai sus. Pe linia a doua se află un număr natural F, reprezentând numărul de fulgere. Pe următoarele F linii se află date despre câte un fulger, în ordinea în care acestea apar. Primul număr de pe fiecare linie este tipul de fulger (1 sau 2 sau 3). Dacă acest număr este 1 sau 2, se mai află pe această linie un spațiu și încă un număr. Acesta reprezintă linia pe care lovește fulgerul (dacă linia din fișier are la început 1), respectiv coloana pe care lovește fulgerul (dacă linia respectivă din fișier are la început 2). Dacă este vorba despre fulger de tip 3, pe acea linie se mai află două numere, reprezentând linia și coloana elementului de pe insulă unde lovește fulgerul, separate prin spațiu. Linia următoare conține un număr Q. Pe următoarele Q linii se află câte două numere (separate prin spațiu) reprezentând linia și coloana unui far de pe insulă pentru care se dorește aflarea stării după furtună.

Date de ieșire

Fișierul de ieșire lumini.out conține pe o linie, separate prin câte un spațiu, Q numere, reprezentând rezultatele interogărilor în ordinea în care acestea apar în fișierul de intrare. Dacă farul corespunzător este aprins se va scrie valoarea 1, iar dacă este stins se va scrie valoarea 0.

Restricții și precizări

  • 2 ≤ L ≤ 2.000.000.000
  • 1 ≤ F ≤ 1000
  • Se garantează că la precizarea fulgerelor linia începe cu 1, 2 sau 3, iar celelalte valori de pe liniile respective sunt cuprinse între 1 și L inclusiv.
  • 1 ≤ Q ≤ 100.000
  • Se garantează că pentru fiecare far a cărei stare trebuie aflată linia și coloana sunt cuprinse între 1 și L inclusiv.
  • Pentru 24 de puncte, L ≤ 100, F ≤ 100 și apar doar fulgere de tipul 1;
  • Pentru alte 18 puncte, L ≤ 100, F ≤ 100;
  • Pentru alte 12 puncte, L ≤ 10.000 și apar doar fulgere de tipul 1;
  • Pentru alte 8 puncte, L ≤ 10.000;
  • Pentru alte 13 puncte, L ≤ 1.000.000;
  • Pentru restul de 25 de puncte nu sunt restricții suplimentare.

Restricții și precizări

  • 2 ≤ L ≤ 2.000.000.000
  • 1 ≤ F ≤ 1000
  • Se garantează că la precizarea fulgerelor linia începe cu 1, 2 sau 3, iar celelalte valori de pe liniile respective sunt cuprinse între 1 și L inclusiv.
  • 1 ≤ Q ≤ 100.000
  • Se garantează că pentru fiecare far a cărei stare trebuie aflată linia și coloana sunt cuprinse între 1 și L inclusiv.
  • Pentru 24 de puncte, L ≤ 100, F ≤ 100 și apar doar fulgere de tipul 1;
  • Pentru alte 18 puncte, L ≤ 100, F ≤ 100;
  • Pentru alte 12 puncte, L ≤ 10.000 și apar doar fulgere de tipul 1;
  • Pentru alte 8 puncte, L ≤ 10.000;
  • Pentru alte 13 puncte, L ≤ 1.000.000;
  • Pentru restul de 25 de puncte nu sunt restricții suplimentare.

https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-7152921241438800&output=html&h=15&slotname=6421896419&adk=1130877403&adf=3550324082&pi=t.ma~as.6421896419&w=728&lmt=1648707972&psa=1&url=https%3A%2F%2Fwww.pbinfo.ro%2Fprobleme%2F3035%2Flumini&wgl=1&dt=1648707972456&bpp=7&bdt=1851&idt=280&shv=r20220329&mjsv=m202203290101&ptt=9&saldr=aa&abxe=1&cookie=ID%3D3586468b963c6e37-22998c1468cd0043%3AT%3D1648703182%3ART%3D1648703182%3AS%3DALNI_MaaxzWiQn-4Abxtgo3-OYKlLTmUVw&prev_fmts=336×280&correlator=8073463139585&frm=20&pv=1&ga_vid=1670626059.1648703180&ga_sid=1648707973&ga_hid=1640517833&ga_fc=1&u_tz=180&u_his=13&u_h=768&u_w=1366&u_ah=728&u_aw=1366&u_cd=24&u_sd=1&adx=116&ady=1915&biw=1349&bih=643&scr_x=0&scr_y=306&eid=44759875%2C44759926%2C44759837%2C44761044%2C31065972&oid=2&pvsid=93489147820730&pem=61&tmod=1013017695&nvt=1&ref=https%3A%2F%2Fwww.pbinfo.ro%2Fsolutii%2Fuser%2FDacsa&eae=0&fc=896&brdim=-8%2C-8%2C-8%2C-8%2C1366%2C0%2C1382%2C744%2C1366%2C643&vis=1&rsz=%7Co%7CeEbr%7C&abl=NS&pfx=0&fu=0&bc=31&ifi=2&uci=a!2&btvi=1&fsb=1&xpc=n80LoF58JQ&p=https%3A//www.pbinfo.ro&dtd=364

Exemplu

lumini.in

4 
3 
1 2 
3 3 1 
2 3 
5 
1 1 
2 4 
3 2 
4 2 
4 4

lumini.out

1 0 0 1 0

Explicație

Inițial starea becurilor de pe insulă poate fi reprezentată astfel:
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
După aplicarea primului fulger starea becurilor devine
1 0 1 0
1 0 1 0
0 1 0 1
1 0 1 0
După aplicarea celui de-al doilea fulger starea becurilor devine
1 0 0 1
1 1 0 1
1 0 1 0
0 1 0 1
După aplicarea celui de-al treilea starea becurilor devine
1 0 1 0
1 1 1 0
1 0 0 1
0 1 1 0

#include <bits/stdc++.h>

using namespace std;
ifstream f("lumini.in");
ofstream g("lumini.out");
#define L 1010
struct fulger
{
    long long poz;
    int fr;
} lin[L], col[L], diag[2*L];
int nLin, nCol, nDiag, n;
int cauta(fulger a[], int n, long long v)
{
    int s=1, d=n, m;
    while(s<=d)
    {
        m=(s+d)/2;
        if(a[m].poz==v)return m;
        else if(v<a[m].poz)d=m-1;
        else s=m+1;
    }
    return s;
}
void insereaza(fulger a[], int &n, long long v)
{
    if(n==0)
    {
        a[++n].poz=v;
        a[n].fr=1;
        return;
    }
    int pozitie=cauta(a,n,v), i;
    if(pozitie<=n && a[pozitie].poz==v)a[pozitie].fr++;
    else
    {
        i=n;
        while(i>0 && a[i].poz>v)a[i+1]=a[i--];
        a[i+1].poz=v;
        a[i+1].fr=1;
        n++;
    }
}
int main()
{
    f>>n;
    int x, y, z, i, Q;
    f>>Q;
    for(i=1; i<=Q; i++)
    {
        f>>x;
        if(x==1)f>>y, insereaza(lin, nLin, y);
        else if(x==2)f>>y, insereaza(col, nCol, y);
        else f>>y>>z, insereaza(diag, nDiag, 1LL*y+1LL*z-1);
    }
    lin[nLin+1].poz=col[nCol+1].poz=diag[nDiag+1].poz=n+1;
    for(i=2; i<=nLin+1; i++)lin[i].fr+=lin[i-1].fr;
    for(i=1; i<=nCol+1; i++)col[i].fr+=col[i-1].fr;
    for(i=1; i<=nDiag+1; i++)diag[i].fr+=diag[i-1].fr;
    f>>Q;
    for(i=1; i<=Q; i++)
    {
        f>>x>>y;
        int far=1-(x%2+y%2)%2;
        int p=cauta(lin,nLin, x);
        if(lin[p].poz>x)p--;
        if(lin[p].fr%2)far=!far;
        p=cauta(col,nCol, y);
        if(col[p].poz>y)p--;
        if(col[p].fr%2)far=!far;
        p=cauta(diag,nDiag, 1LL*x+1LL*y-1);
        if(diag[p].poz>1LL*x+1LL*y-1)p--;
        if(diag[p].fr%2)far=!far;
        g<<far<<' ';
    }
    return 0;
}
%d bloggers like this: